如何获取包含多个字段的字节序列(unicode 字符 + 32 位整数 + unicode 字符串)的变量



我想得到一个包含多个字段的字节序列的变量(它们稍后将通过套接字传输(。

字节序列将包括以下三个字段:

  • 字符 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 字符串。

最新更新