2013-12-11 110 views
1

我正在使用Java將double轉換爲字節數組。就像這樣:如何將字節數組轉換爲python中的double?

public static byte[] toByteArray(double value) { 
    byte[] bytes = new byte[8]; 
    ByteBuffer.wrap(bytes).putDouble(value); 
    return bytes; 
} 

現在,我想這個字節數組轉換回雙。在Java中,我會做這樣的:

public static double toDouble(byte[] bytes) { 
    return ByteBuffer.wrap(bytes).getDouble(); 
} 

現在,我該怎麼用Python語言編寫的toDouble()方法?

回答

2

的Python有struct module以字節轉換回float值:

import struct 

value = struct.unpack('d', bytes)[0] 

這裏'd'意味着雙重價值預計(在本地字節序,爲8個字節) 。請參閱模塊文檔以獲取更多選項,包括指定字節數。

另一種選擇是將您的bytes值變成array object;你會使用這個,如果你有加倍的同質序列:

import array 

doubles_sequence = array.array('d', bytes) 

,每一個8個字節被解釋爲一個double值,使得doubles_sequence雙打的順序,通過索引尋址。要支持不同的字節順序,可以將字節順序與doubles_sequence.byteswap()交換。

+0

你將如何從'doubles_sequence'中提取雙打。說出第一雙。 – user2426316

+0

@ user2426316:''doubles_sequence [0]'給你第一個值,就像在列表中一樣。 –

3

你想要struct模塊:

>>> d = 1.234 
>>> b = struct.pack('d', d) 
>>> b 
b'X9\xb4\xc8v\xbe\xf3?' 
>>> d2, = struct.unpack('d', b) 
>>> d2 
1.234 

pack方法,讓你在Python 3.x的一個bytes,或在Python 2.x的一個str這種類型不像Java byte[]那樣可變,在2.x中它也像一串單字符串,而不是從0到255之間的數字序列。如果您需要修復其中任何一種,只需將其轉換爲bytearray即可。

另外,請注意,在Java和Python中,您可能希望更頻繁地指定明確的字節順序,特別是在計劃將字節保存到文件或通過網絡發送時。有關詳細信息,請參見Format Strings

所以:

>>> b = bytearray(struct.pack('!d', d)) 
>>> b 
bytearray(b'?\xf3\xbev\xc8\xb49X') 
>>> b[0] 
63 
相關問題