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

2 投票
3 回答
2555 浏览
提问于 2025-04-16 12:20

我想把一组配置选项编码成一串很长的十六进制数字。

输入的数据包括数字(整数和浮点数)和字符串。我可以用标准库里的 binascii.a2b_hex 来处理字符串,用位运算符来处理整数,可能如果我去了解一下浮点数的表示方法(唉),我也能处理浮点数。

现在,我有几个问题:

  • 在给定选项列表时,我应该如何检查值的类型,以选择正确的转换方法呢?
  • 难道没有库函数可以处理数字吗?我似乎找不到。

这些序列化的数据会发送到一个嵌入式设备上,而我对接收这些数据的代码控制有限(也就是说,可以改动,但会很麻烦)。序列化的规范似乎遵循C语言的值表示(字符串用字符数组表示,整数用小端格式,浮点数用IEEE 754标准),但并没有明确说明。所以,像pickle这样的Python特有的东西是不能用的。

3 个回答

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]
4

你需要用到struct这个模块。

>>> struct.pack('16sdl', 'Hello, world!', 3.141592654, 42)
'Hello, world!\x00\x00\x00PERT\xfb!\t@*\x00\x00\x00\x00\x00\x00\x00'
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字符之类的东西来弄明白它的长度。

撰写回答