Python 4 字节长度的字符串前缀
Python String Prefix by 4 Byte Length
我正在尝试在 Python 中编写一个服务器来与一个预先存在的客户端通信,该客户端的消息数据包是 ASCII 字符串,但前面加上代表剩余长度的四字节无符号整数值字符串.
我已经完成了一个接收器,但我确信还有一个更 pythonic 的方式。在我找到它之前,我还没有完成发件人。我可以轻松计算消息长度,将其转换为字节并传输 message.The 位 我正在努力创建一个整数,它是一个包含四个字节的数组。
让我澄清一下:如果我的字符串长度为 260 个字符,我希望在前面加上 260 的大端四字节整数表示。因此,我不希望 ASCII 字符串“0260”位于字符串,相反,我想要代表 0x00000104 的四个(非 ASCII)字节。
我的代码接收来自客户端的长度前置字符串如下所示:
sizeBytes = 4 # size of the integer representing the string length
# receive big-endian 4 byte integer from client
data = conn.recv(sizeBytes)
if not data:
break
dLen = 0
for i in range(sizeBytes):
dLen = dLen + pow(2,i) * data[sizeBytes-i-1]
data = str(conn.recv(dLen),'UTF-8')
我可以简单地做相反的事情。我是Python的新手,感觉自己做的可能是手写的!!
1)有没有更好的接收和解码长度的方法?
2) "sister"编码传输长度的方法是什么?
谢谢。
struct 模块在这里很有用
写作:
import struct
msg = 'some message containing 260 ascii characters'
length = len(msg)
encoded_length = struct.pack('>I', length)
encoded_length 将是一个 4 字节的字符串,值为 '\x00\x00\x01\x04'
阅读:
length = struct.unpack('>I', received_msg[:4])[0]
使用 asyncio
的示例:
import asyncio
import struct
def send_message(writer, message):
data = message.encode()
size = struct.pack('>L', len(data))
writer.write(size + data)
async def receive_message(reader):
data = await reader.readexactly(4)
size = struct.unpack('>L', data)[0]
data = await reader.readexactly(size)
return data.decode()
完整代码为here
我正在尝试在 Python 中编写一个服务器来与一个预先存在的客户端通信,该客户端的消息数据包是 ASCII 字符串,但前面加上代表剩余长度的四字节无符号整数值字符串.
我已经完成了一个接收器,但我确信还有一个更 pythonic 的方式。在我找到它之前,我还没有完成发件人。我可以轻松计算消息长度,将其转换为字节并传输 message.The 位 我正在努力创建一个整数,它是一个包含四个字节的数组。
让我澄清一下:如果我的字符串长度为 260 个字符,我希望在前面加上 260 的大端四字节整数表示。因此,我不希望 ASCII 字符串“0260”位于字符串,相反,我想要代表 0x00000104 的四个(非 ASCII)字节。
我的代码接收来自客户端的长度前置字符串如下所示:
sizeBytes = 4 # size of the integer representing the string length
# receive big-endian 4 byte integer from client
data = conn.recv(sizeBytes)
if not data:
break
dLen = 0
for i in range(sizeBytes):
dLen = dLen + pow(2,i) * data[sizeBytes-i-1]
data = str(conn.recv(dLen),'UTF-8')
我可以简单地做相反的事情。我是Python的新手,感觉自己做的可能是手写的!!
1)有没有更好的接收和解码长度的方法?
2) "sister"编码传输长度的方法是什么?
谢谢。
struct 模块在这里很有用
写作:
import struct
msg = 'some message containing 260 ascii characters'
length = len(msg)
encoded_length = struct.pack('>I', length)
encoded_length 将是一个 4 字节的字符串,值为 '\x00\x00\x01\x04'
阅读:
length = struct.unpack('>I', received_msg[:4])[0]
使用 asyncio
的示例:
import asyncio
import struct
def send_message(writer, message):
data = message.encode()
size = struct.pack('>L', len(data))
writer.write(size + data)
async def receive_message(reader):
data = await reader.readexactly(4)
size = struct.unpack('>L', data)[0]
data = await reader.readexactly(size)
return data.decode()
完整代码为here