我有一个字节数组,最初是从Scala中的float数组转换而来的。我需要将其转换回Python中的float数组。
这是我用来在Scala中转换float数组的代码:
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()
然后在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
请让我知道如何获得正确的浮动?
答案 0 :(得分:2)
显然,对值进行编码的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,)
答案 1 :(得分:1)
可能是由于字节序编码。
您应该尝试大尾数法:
struct.unpack('>f', bytes_ary[0:4])
或小端:
struct.unpack('<f', bytes_ary[0:4])
答案 2 :(得分:0)
取决于您的字节数组。
如果
print(byte_array_of_old_float)
返回
bytearray(b'684210')
那么这应该有效:
floatvar=float(byte_array_of_old_float)
在我的例子中,字节数组来自 MariaDB 选择调用,我就是这样做的。