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

moz*_*ami 4 python string binary list

我有一个数字列表,我想作为二进制数据发送到套接字连接.

举个例子,我从以下列表开始:

data = [2,25,0,0,ALPHA,0,23,18,188]
Run Code Online (Sandbox Code Playgroud)

在上面的列表中,ALPHA可以是介于1和999之间的任何值.最初,我将其转换为使用的字符串

 hexdata = ''.join([chr(item) for item in data])
Run Code Online (Sandbox Code Playgroud)

因此,如果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'
Run Code Online (Sandbox Code Playgroud)

这很好用,'\ 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'
Run Code Online (Sandbox Code Playgroud)

我一直在查看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'
Run Code Online (Sandbox Code Playgroud)

这有意义吗?

就解包而言,我只是将这些数据发送到套接字上,我将接收数据但已经处理好了.

编辑2

我发出的字符串总是固定长度.为简单起见,我认为最好将列表表示如下:

ALPHA = 101

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


ALPHA = 301

data = [25,alpha1,alpha2,1]
hexdata = 'x19\x01\x2d\x01'
Run Code Online (Sandbox Code Playgroud)

正如您在hexdata字符串中看到的那样,然后变为:\ x01\x2d \

如果ALPHA <256,alpha1 = 0.

Ale*_*lli 9

如果ALPHA <256,则要为ALPHA发送单个字节,如果> = 256,则为两个字节发送?这看起来很奇怪 - 接收器怎么知道是哪种情况...... ???

但是,如果这是你想要的,那么

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

是实现这一目标的一种方法.

  • 我建议使用big-endian,因为每个网络协议都应该如此(以避免任何意外). (3认同)

Ant*_*sma 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'
Run Code Online (Sandbox Code Playgroud)