Java实现ISO 2111标准CRC16校验码不匹配问题求助
关于ISO-2111-1985标准CRC校验的问题
问题概述
我需要用Java实现遵循ISO-2111-1985标准的CRC校验,目前遇到校验码不匹配的问题:
- 原始十六进制数据:
220017e11201040c9ebce8003201028149d3d904808d14 - 目标数据(已添加起始DLE
1002和结束DLE1003):1002220017e11201040c9ebce8003201028149d3d904808d141003939c
我能正常完成DLE的添加操作,但生成的CRC校验码与目标末尾的939c不符——自己的代码输出结果为d806,部分在线CRC计算器也得出相同结果。
我的Java CRC16实现代码
public static String calculateCRC16(final byte[] bytes) { int CRC = 0xFFFF; // initial CRC value : 0xFFFF -> max value of 65535 int POLYNOMIAL = 0x1021; // 0x1021 = x^16 + x^12 + x^5 + 1 for (byte b : bytes) { for (int i = 0; i < 8; i++) { boolean bit = ((b >> (7 - i) & 1) == 1); boolean c15 = ((CRC >> 15 & 1) == 1); CRC <<= 1; if (c15 ^ bit) { CRC ^= POLYNOMIAL; } } } CRC &= 0xffff; return Integer.toHexString(CRC); }
ISO-2111-1985标准第8节规定
8 块校验序列(BCS)
BCS应符合以下规则:
8.1 应为16位序列(两个八位字节)。
8.2 受保护数据块中的信息比特序列可表示为多项式L(x)(GF 2):BCS是多项式L(x)(GF2)乘以x^16后,除以生成多项式p(x) = x^16 + x^12 + x^5 + 1(GF2)的余数。GF2表示这些多项式的系数在二元伽罗瓦域中。
8.3 BCS传输时应从最高次项的系数开始。
8.4 接收端,受保护的输入数据与BCS一起除以生成多项式,无传输错误时余数应为零。
疑问
- 是否在计算CRC前遗漏了某些处理步骤?
- 对方提供的目标数据是否存在错误?
- 我是否误解了标准第8节的内容?
内容的提问来源于stack exchange,提问作者AliasDan
相关产品推荐
相关产品推荐

