You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现ISO 2111标准CRC16校验码不匹配问题求助

关于ISO-2111-1985标准CRC校验的问题

问题概述

我需要用Java实现遵循ISO-2111-1985标准的CRC校验,目前遇到校验码不匹配的问题:

  • 原始十六进制数据:220017e11201040c9ebce8003201028149d3d904808d14
  • 目标数据(已添加起始DLE1002和结束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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:23:35