我想将一组配置选项编码为一个十六进制数字的长字符串。
输入是数字(整数和浮点数)和字符串的混合。我可以使用标准库中的binascii.a2b_hex
作为字符串,使用整数的逐位运算符,可能,如果我去读一些关于浮点表示(叹气)的话,我也可以处理浮点数。
现在,我的问题:
序列化数据被发送到嵌入式设备,我对使用它的代码的控制有限(意思是,可能会有变化,但很麻烦)。序列化的规范似乎符合C值表示(字符串的char数组,Little Endian整数,浮点数的IEEE 754),但它没有明确说明这一点。因此,像pickle这样的特定于Python的东西是禁止的。
答案 0 :(得分: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]
答案 1 :(得分:2)
你想要struct
。
>>> struct.pack('16sdl', 'Hello, world!', 3.141592654, 42)
'Hello, world!\x00\x00\x00PERT\xfb!\t@*\x00\x00\x00\x00\x00\x00\x00'
答案 2 :(得分: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字符或其他内容来解决它。