Python3套接字在一条消息中发送ASCII文本和二进制(4byte)标志

时间:2018-01-26 19:36:06

标签: python sockets bits

这是我的第一个问题。我正在通过论坛寻找,但找不到发送aswer。 我需要在一条消息中发送一个ASCII文本,然后是4字节(不少于)二进制标志的组合,而不是跟随ASCII文本

位标志的格式定义如下:

长度4个字节b。可选元素或可选元素组的存在由设置位(= 1)表示,缺少非设置位(= 0)。不需要的比特是0。 值0b00000000 00000000 00000000 00000011表示仅发送“可选元素”部分中的“字段”,其中“Top”。实验室“栏目是1或2。 对于0b00000000 00000000 00000000 01111111,所有可选元素字段都在“Top”中发送。实验室“列是数字1到7之一。 对于0b00000000 00000000 00000000 10000000,只有“可选元素”部分中的“字段”发送到“顶部”。实验室“专栏是8。​​

假设我想为字段1和4发送标志,所以我准备了代码:

ba=bytearray(4) #for bits array of flags
ba[0]=17         #set bits 1 and 4
message='string1'.encode('ascii') + ba + 'string2'.encode('ascii') #message to send
socket.send(message)
  • 有更好的方法:
    1. 建立4个字节的咬值?
    1. 将其与ascii文本一起发送到套接字消息中?

我之前尝试直接发送字节,但这会产生连接错误,或者如果是字节字符串b'0000 ..... 0'则将其发送为32字节而不是4字节的长度。

更新 'string1'定义了长度为22bytes(消息头)并包含有关消息类型,发送者ID,'string2'长度的信息。这部分按预期工作,只发送位标志对我来说是个问题。到目前为止,我只是发送4个字节的ascii编码字符串0000,这使我可以正确地在另一侧接收消息。这当然不代表0b00000000 00000000 00000000 00000000所以其他方面解释消息内容错误的方式。

1 个答案:

答案 0 :(得分:0)

在Python中,将值表示为固定字节数的首选方法是使用struct模块。显式使用位标志也更容易,而不是像17这样的不透明值:

import struct
flags = 1 << 0 | 1 << 4 # Equivilent to flags = 17 but much easier to understand
message = 'string1'.encode('ascii') + struct.pack('>I', flags) + 'string2'.encode('ascii')
socket.send(message)

请注意,endianness可能存在问题,但我必须查看更多协议,以确定'string1'.encode('ascii')是否有效。