0

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

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

  • 字符 SOH(ANSI 代码 0x01)
  • 32位整数
  • Unicode 字符串 'Straße'

我努力了:

# -*- coding: UTF-8 -*-

message = b''

soh = u'\0001'
a = 1143
c = u'Straße'

message = message + soh + a + c

print(type(message))

但我得到:

TypeError: can't concat str to bytes

我也不确定这soh = u'\0001'是定义 SOH 字符的正确方法。

我正在使用 Python 3.7

4

3 回答 3

1

通过套接字连接传输的二进制数据最好使用struct模块进行组合。

struct 模块提供了一个 pack 函数来创建数据结构。您需要提供一个格式字符串来描述正在打包的数据。值得研究格式字符串文档,以确保数据在接收端按预期解包。

>>> 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'\x01\x00\x00\x00w\x04\x00\x00Stra\xc3\x9fe'

该模块提供了一个解包函数来反转打包:

>>> soh_, a_, c_ = struct.unpack(pattern, packed)
>>> soh_
b'\x01'
>>> a
1143
>>> a_
1143
>>> c_.decode('utf-8')
'Straße'
于 2019-08-07T11:25:26.653 回答
0

因为 a 是一个 int,所以你不能将它与 str 连接起来。您应该做的是尝试在所有 soh、a 和 c 上使用 .encode(),然后将它们连接到消息(.encode 使类型从 str 变为字节)

(在 python 3.x 中,unicode 类型不再存在(它与 str 相同),因此您必须使用 str 或 bytes)

于 2019-08-07T10:56:10.933 回答
0

以防万一它对其他人有帮助,我终于做到了:

message = soh.encode('utf-8') + a.to_bytes(4, 'big') + c.encode('utf-8')

struct.pack 是非常有趣的解决方案,但我没有设法将整数强制为 32 位,并且在我的特定格式中,字段结构是事先不知道的(因此无论如何都需要在客户端和服务器之间共享它的机制)。

因此,我将 .to_bytes 与 .encode 混合用于 unicode 字符串。

于 2019-08-07T12:05:33.353 回答