我想得到一个包含多个字段的字节序列的变量(它们稍后将通过套接字传输(。
字节序列将包括以下三个字段:
- 字符 SOH(ANSI 代码 0x01(
- 32位整数
- Unicode 字符串 'Straße'
我试过:
# -*- coding: UTF-8 -*-
message = b''
soh = u' 001'
a = 1143
c = u'Straße'
message = message + soh + a + c
print(type(message))
但我得到:
TypeError: can't concat str to bytes
我也不确定soh = u' 001'
是定义SOH字符的正确方法。
我正在使用Python 3.7
最好使用结构模块组合通过套接字连接传输的二进制数据。
结构模块提供了一个包函数来创建数据结构。 您需要提供描述要打包的数据的格式字符串。 值得研究格式字符串文档,以确保数据在接收端按预期解压缩。
>>> soh = b'x01'
>>> a = 1143
>>> c = u'Straße'
>>> import struct
>>> pattern = 'ci7s' # 1 byte, 1 int, 1 bytestring of length 7
>>> packed = struct.pack(pattern, soh, a, c.encode('utf-8'))
>>> packed
b'x01x00x00x00wx04x00x00Straxc3x9fe'
该模块提供解包功能来反转包装:
>>> soh_, a_, c_ = struct.unpack(pattern, packed)
>>> soh_
b'x01'
>>> a
1143
>>> a_
1143
>>> c_.decode('utf-8')
'Straße'
因为 a 是一个 int,所以你不能用 str 连接它。 你应该做的是尝试在所有soh,a和c上使用.encode((,然后将它们连接到消息(.encode使类型从str到字节(
(在python 3.x中,unicode类型不再存在(它与str相同(,因此您必须使用str或bytes(
以防万一它对其他人有帮助,我终于这样做了:
message = soh.encode('utf-8') + a.to_bytes(4, 'big') + c.encode('utf-8')
struct.pack 是一个非常有趣的解决方案,但我没有设法强制整数为 32 位,并且在我的特定格式中,字段结构事先不知道(因此无论如何都需要一种在客户端和服务器之间共享它的机制(。
因此,我将.to_bytes与 .encode 混合用于 unicode 字符串。