1

我正在将 API 从 2.7 升级到 3.8。它被构建为通过 TCP 套接字与代理进行通信。我遇到了校验和计算不正确的问题。我从我的代理那里收到一条消息,说校验和是错误的。

我知道这不是我的代理,因为仅接受标头数据包的 CRC 检查,并且命令在代理端正确执行。

我遇到问题的代码行是:

body += format(struct.pack("=L", binascii.crc32(format(body).encode()) & 0xFFFFFFFF))

在 2.7 之前,这行代码没有编码/格式。

有谁知道我做错了什么?

我有一种强烈的感觉,它与“正文字符串”的编码有关。在将代码行分解为其组件后,我确认 binascii.crc32() 的 int 输出在 3.8 和 2.7 之间是不同的,并且对各种字节/字符类型进行了一些阅读,我变得非常迷茫。

4

1 回答 1

0

因此正确的代码行是将校验和和正文同时附加到数据包缓冲区,而不是将校验和添加到正文,然后将正文添加到数据包缓冲区。这避免了导致问题的解码阶段。

buf = buf + format(body).encode() + struct.pack("=L", binascii.crc32(format(body).encode()) & 0xFFFFFFFF)

原来的会输出: '{"datasetName": "X_train", "fileName": "/test/MNIST/X_train_uint8.h5"}b\'y\\xf8D\\xec\''

此答案输出中看到的正确解决方案: '{"datasetName": "X_train", "fileName": "/test/MNIST/X_train_uint8.h5"}y\xf8D\xec'

于 2021-03-18T20:52:57.600 回答