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

问题描述:

我想将一组配置选项编码为长字符串的十六进制数字。在Python中,如何将数字和字符串转换为字节数组?

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

现在,我的问题:

  • 当给定的选项列表,(如何)我应该输入检查,以选择正确的转换例程的价值?
  • 数字库也没有函数吗?我似乎无法找到它。

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

那么使用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

你最简单的办法是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

你想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