python - 计算字符串的 CRC32 校验和
问题描述
我正在将 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 之间是不同的,并且对各种字节/字符类型进行了一些阅读,我变得非常迷茫。
解决方案
因此正确的代码行是将校验和和正文同时附加到数据包缓冲区,而不是将校验和添加到正文,然后将正文添加到数据包缓冲区。这避免了导致问题的解码阶段。
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'
推荐阅读
- hide - 在 API 级别 19 及以上的 Android 平板电脑中隐藏导航栏
- sonos - 从 Sonos 身份验证页面返回错误代码
- kotlin - 我们需要在 kotlin 中初始化可为空的字段吗?
- ios - 芬兰App Store本地化没有效果?
- gridview - Yii2 Gridview ID 选项
- amazon-web-services - 将 docker 映像从一个 AWS ECR 存储库复制到另一个
- python - 我想将列表拆分为两个列表 right_order[] 和 reverse_order[],同时比较列表中的项目
- javascript - 我如何验证/比较节点 js 中的两个日期以确保 endDate 在 startDate 24 小时后失效?
- spring - Spring Batch 失败更新表
- c# - C#更改MS word文档(.docx)上字符的颜色