Как преобразовать байтовый массив в плавающий в Python - PullRequest
0 голосов
/ 31 мая 2019

У меня есть байтовый массив, который первоначально был преобразован из массива с плавающей точкой в ​​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()

Затем в 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 

Пожалуйста, дайте мне знать, как мне получить правильное число?

Ответы [ 2 ]

2 голосов
/ 31 мая 2019

Очевидно, что код 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 голос
/ 31 мая 2019

Это может быть из-за кодировки байтов.

Вы должны попробовать big endian:

struct.unpack('>f', bytes_ary[0:4])

или байтовый порядок

struct.unpack('<f', bytes_ary[0:4])
...