在Python中将整数列表转换为二进制"字符串

4 投票
5 回答
23407 浏览
提问于 2025-04-15 13:52

我有一串数字,想把它们通过一个套接字连接发送出去,格式是二进制数据。

举个例子,我开始时有以下这个列表:

data = [2,25,0,0,ALPHA,0,23,18,188]

在这个列表中,ALPHA 可以是1到999之间的任何值。最开始,我是用下面的方式把它转换成字符串:

 hexdata = ''.join([chr(item) for item in data])

所以如果 ALPHA 是 101,那么返回的字符串就是:

>>> data = [2,25,0,0,101,0,23,18,188]
>>> hexdata = ''.join([chr(item) for item in data])
>>> hexdata
'\x02\x19\x00\x00e\x00\x17\x12\xbc'

这样做没问题,'\x02\x19\x00\x00e\x00\x17\x12\xbc' 就是我需要发送的字符串。

但是,对于大于255的 ALPHA 值,这种方法就不行了,因为超出了 chr 语句的范围。比如说如果 ALPHA 是 999,我希望得到的字符串是:

data = [2,25,0,0,999,0,23,18,188]
hexdata = '\x02\x19\x00\x03\xed\x00\x17\x12\xbc'

我查看了 struct.pack() 的文档,但不太明白怎么用它来得到上面的字符串。列表中只有 ALPHA 这个变量。

任何帮助都非常感谢。

编辑 1

你想要什么样的行为?256到65535之间的值需要用2个字节来表示。你想在另一端解包吗?请更新帖子,说明你的意图。 – gahooa 1分钟前

没错,因为999超过了256的阈值,所以它需要用两个字节来表示:

data = [2,25,0,0,999,0,23,18,188]

hexdata = '\x02\x19\x00**\x03\xed**\x00\x17\x12\xbc'

这样说有道理吗?

至于解包,我只是把这些数据发送出去,接收数据的部分我已经处理好了。

编辑 2

我发送的字符串长度是固定的。为了简单起见,我觉得把列表表示成这样更好:

ALPHA = 101

data = [25,alpha1,alpha2,1]
hexdata = '\x19\x00e\x01'


ALPHA = 301

data = [25,alpha1,alpha2,1]
hexdata = 'x19\x01\x2d\x01'

正如你在 hexdata 字符串中看到的,这就变成了:\x01\x2d\

如果 ALPHA < 256,那么 alpha1 = 0。

5 个回答

3

你可以使用Python中的数组功能。

import array
a = array.array('i')
a.extend([2,25,0,0,101,0,23,18,188])
output = a.tostring()
5

如果你事先知道数据和ALPHA的位置,最好的办法是使用struct.pack来处理这个位置,并且用大端格式的短整型来表示,同时可以省略掉可能会被覆盖的0:

def output(ALPHA):
    data = [2,25,0,ALPHA,0,23,18,188]
    format = ">BBBHBBBB"
    return struct.pack(format, *data)
output(101) # result: '\x02\x19\x00\x00e\x00\x17\x12\xbc'
output(999) # result: '\x02\x19\x00\x03\xe7\x00\x17\x12\xbc'
9

你想要发送一个字节的ALPHA值,如果它小于256,但如果大于等于256就发送两个字节?这听起来有点奇怪——接收方怎么知道是哪种情况呢……???

不过,如果这确实是你想要的,那么

x = struct.pack(4*'B' + 'HB'[ALPHA<256] + 4*'B', *data)

就是实现这个的一个方法。

撰写回答