Saya memiliki array byte, yang awalnya dikonversi dari array float di Scala. Saya perlu mengubahnya kembali menjadi array float dengan Python.

Ini adalah kode yang saya gunakan untuk mengonversi array float di 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()

Kemudian dengan Python, saya bisa mendapatkan array byte ini dan saya perlu mengubahnya kembali menjadi array float.

Saya telah mencoba kode berikut dengan Python, tetapi tidak memberi saya float yang tepat.

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 

Tolong beri tahu saya bagaimana saya harus mendapatkan pelampung yang tepat?

1
Will Wang 31 Mei 2019, 16:59

2 jawaban

Jawaban Terbaik

Rupanya kode Scala yang mengkodekan nilai menggunakan urutan byte yang berbeda dari kode Python yang menerjemahkannya.

Pastikan Anda menggunakan urutan byte yang sama (endianness) di kedua program.

Dengan Python, Anda dapat mengubah urutan byte yang digunakan untuk mendekode nilai dengan menggunakan >f atau <f alih-alih f. Lihat 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,)
4
mkrieger1 31 Mei 2019, 14:24

Bisa jadi karena pengkodean endian.

Anda harus mencoba big endian:

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

Atau little endian:

struct.unpack('<f', bytes_ary[0:4])
0
Alain T. 31 Mei 2019, 14:22