Wil*_*ang 1 python floating-point endianness
我有一个字节数组,它最初是从 Scala 中的浮点数组转换而来的。我需要将它转换回 Python 中的浮点数组。
这是我用来在 Scala 中转换浮点数组的代码:
val float_ary_len = float_ary.size
val bb = java.nio.ByteBuffer.allocate(float_ary_len * 4)
for(each_float <- float_ary){
bb.putFloat(each_folat)
}
val bytes_ary = bb.array()
Run Code Online (Sandbox Code Playgroud)
然后在 Python 中,我可以获得这个字节数组,我需要将它转换回一个浮点数组。
我在 Python 中尝试了以下代码,但它没有给我正确的浮点数。
print(list(bytes_ary[0:4]))
#['\xc2', '\xda', 't', 'Z']
struct.unpack('f', bytes_ary[0:4])
# it gave me 1.7230105268977664e+16, but it should be -109.22725
Run Code Online (Sandbox Code Playgroud)
请让我知道我应该如何获得正确的浮点数?
显然,对值进行编码的 Scala 代码使用与解码它的 Python 代码不同的字节顺序。
确保在两个程序中使用相同的字节顺序(字节序)。
在 Python 中,您可以使用>f或<f代替来更改用于解码值的字节顺序f。请参阅https://docs.python.org/3/library/struct.html#struct-alignment。
>>> b = b'\xc2\xdatZ'
>>> struct.unpack('f', b) # native byte order (little-endian on my machine)
(1.7230105268977664e+16,)
>>> struct.unpack('>f', b) # big-endian
(-109.22724914550781,)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9191 次 |
| 最近记录: |