在Python中,如何将数字和字符串转换为字节数组?

时间:2011-02-22 23:01:58

标签: python serialization

我想将一组配置选项编码为一个十六进制数字的长字符串。

输入是数字(整数和浮点数)和字符串的混合。我可以使用标准库中的binascii.a2b_hex作为字符串,使用整数的逐位运算符,可能,如果我去读一些关于浮点表示(叹气)的话,我也可以处理浮点数。

现在,我的问题:

  • 当给出选项列表时,我应该键入(如何)检查值以选择正确的转换例程?
  • 这些数字也没有图书馆功能吗?我似乎无法找到它。

序列化数据被发送到嵌入式设备,我对使用它的代码的控制有限(意思是,可能会有变化,但很麻烦)。序列化的规范似乎符合C值表示(字符串的char数组,Little Endian整数,浮点数的IEEE 754),但它没有明确说明这一点。因此,像pickle这样的特定于Python的东西是禁止的。

3 个答案:

答案 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字符或其他内容来解决它。