2011-02-22 50 views
2

我想將一組配置選項編碼爲長字符串的十六進制數字。在Python中,如何將數字和字符串轉換爲字節數組?

輸入是數字(整數和浮點數)和字符串的混合。我可以使用標準庫中的binascii.a2b_hex作爲字符串,位整型運算符,如果我去讀浮點表示(嘆氣),我也可以處理浮點數。

現在,我的問題:

  • 當給定的選項列表,(如何)我應該輸入檢查,以選擇正確的轉換例程的價值?
  • 數字庫也沒有函數嗎?我似乎無法找到它。

序列化的數據被髮送到嵌入式設備,我對使用它的代碼(意味着更改是可能的,但很麻煩)的控制有限。序列化規範似乎符合C值表示(char數組用於字符串,Little Endian整數,IEEE 754用於浮點數),但沒有明確說明這一點。所以,像pickle這樣的Python特定的東西是禁止的。

回答

1

那麼使用struct模塊來打包/拆包呢?

import struct 
s = struct.pack('S5if',"Hello",42,3.1415) 
print s 
print struct.unpack('5sif') 

,或者如果你真的想只是個十六進制字符

import struct, binascii 
s = binascii.b2a_hex(struct.pack('S5if',"Hello",42,3.1415)) 
print s 
print struct.unpack('5sif',binascii.a2b_hex(s)) 

當然,這需要你知道正在跨越或發送字符串的長度,你可以通過尋找一個NULL字符弄明白或者其他的東西。

+0

字符串被固定長度(截斷或填充空字節)序列化,所以很適合結構。 – 2011-02-22 23:57:33

2

你最簡單的辦法是pickle整個列表爲一個字符串,然後使用binascii.a2b_hex()這個字符串轉換爲十六進制數字:

a = ["Hello", 42, 3.1415] 
s = binascii.b2a_hex(pickle.dumps(a, 2)) 
print s 
# 80025d710028550548656c6c6f71014b2a47400921cac083126f652e 
print pickle.loads(binascii.a2b_hex(s)) 
# ['Hello', 42, 3.1415] 
+0

對不起,不能使用pickle,序列化的用戶是一個用C編寫的嵌入式設備,所以我有一個特定的編碼合約。 – 2011-02-22 23:28:04

2

你想struct

>>> struct.pack('16sdl', 'Hello, world!', 3.141592654, 42) 
'Hello, world!\x00\x00\x00PERT\xfb!\[email protected]*\x00\x00\x00\x00\x00\x00\x00' 
+0

是的,我有。謝謝。 :)(接受亞當的回答,但也贊成你的) – 2011-02-22 23:54:41

相關問題