python - 将 GDL90 CRC 代码转换为 Python 时出现问题
问题描述
在 GDL90 规范中有一段 C 代码可用于开发 CRC-16 校验和表。我已将其转换为 Python 3.8,但结果是无稽之谈,表值单调增长到 16 位以上。我究竟做错了什么?
GDL90 代码:
void crcInit( void )
{
unsigned int i, bitctr, crc;
for (i = 0; i < 256; i++)
{
crc = (i << 8);
for (bitctr = 0; bitctr < 8; bitctr++)
{
crc = (crc << 1) ^ ((crc & 0x8000) ? 0x1021 : 0);
}
Crc16Table[i] = crc;
}
}
我的翻译:
crcTable = []
for i in range(256):
crc = (i << 8)
for bitctr in range(8):
# original line crc = (crc << 1) ^ ((crc & 0x8000) ? 0x1021 : 0)
if (crc & 0x8000):
val = 0x1021
else:
val = 0
crc = (crc << 1) ^ val
crcTable.append(hex(crc))
解决方案
不要使用hex(crc)
- 将值转换为字符串。您不包含 Crc16Table 的 c 定义-我想您想将 8 位或 16 位值保存到表中,因此请保存crc&0xff
或crc&0xffff
推荐阅读
- performance - 如何快速填充选择并且仅一次
- linux - 为什么基于软件的 TPM 攻击如此罕见?TPM 如何防范它们?
- c++ - 如何让文本编辑框既可以调整大小又不会让滚动条变得不稳定?
- html - Different navigation title for laptop and mobile device using CSS
- android - R8 说类型被多次定义:在 build\.transforms 和 build\tmp\kotlin-classes
- ios - 以非阻塞方式等待 CIContext 渲染任务
- php - 编辑现有帖子时 ::find() 中的 Lavavel 未定义变量
- iis - 在已发布的 Net Core 项目中修改连接字符串
- javascript - 在 SharePoint 文件夹中加载新项目时如何使脚本灵活
- postgresql - 如何在 PostgreSQL 中全局重新定义 nextval?