Java中多项式x^16 + x^12 + x^5 + 1计算CCITT标准CRC

2024-01-28

我需要帮助在 Java 中使用多项式 x^16 + x^12 + x^5 + 1 (0x1081) 计算 CCITT 标准 CRC。我在互联网上尝试了很多示例,但每个示例都返回与示例中不同的值。

例如,对于此数组 [0xFC] [05] [11],结果需要为 [27] [56]。

使用此代码:

public static void main(String[] args) {
        byte[] array = new byte[3];
        array[0] = (byte) 0xFC;
        array[1] = (byte) 0x05;
        array[2] = (byte) 0x11;
//        array[3] = (byte) 0x00;
//        array[4] = (byte) 0x00;

        System.out.println(Integer.toHexString(crc16(array)));
    }

    private static final int POLYNOMIAL = 0x1081;
    private static final int PRESET_VALUE = 0xFFFF;

    public static int crc16(byte[] data) {
        int current_crc_value = PRESET_VALUE;
        for (int i = 0; i < data.length; i++) {
            current_crc_value ^= data[i] & 0xFF;
            for (int j = 0; j < 8; j++) {
                if ((current_crc_value & 1) != 0) {
                    current_crc_value = (current_crc_value >>> 1) ^ POLYNOMIAL;
                } else {
                    current_crc_value = current_crc_value >>> 1;
                }
            }
        }
        current_crc_value = ~current_crc_value;

        return current_crc_value & 0xFFFF;
    } 

我得到结果FA DE不是 [27] [56]

使用此代码:

public static void main(String[] args) { 
        int crc = 0x0000;         
        int polynomial = 0x1081;   

        // byte[] testBytes = "123456789".getBytes("ASCII");

//        byte[] array = args[0].getBytes();
        byte[] array = new byte[3];
        array[0] = (byte) 0xFC;
        array[1] = (byte) 0x05;
        array[2] = (byte) 0x11;

        for (byte b : array) {
            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;
        System.out.println("CRC16-CCITT = " + Integer.toHexString(crc));
    }

我明白了CRC16-CCITT = 8dca

使用此代码:

private final int polynomial = 0x1081;

    private int[] table = new int[256];

    public int ComputeChecksum(int[] bytes) {
        int crc = 0xffff;
        for (int i = 0; i < bytes.length; ++i) {
            int index = (crc ^ bytes[i]) % 256;
            crc = (crc >> 8) ^ table[index];
        }
        return crc;
    }

    public CRC162() {
        int value;
        int temp;
        for (int i = 0; i < table.length; ++i) {
            value = 0;
            temp = i;
            for (byte j = 0; j < 8; ++j) {
                if (((value ^ temp) & 0x0001) != 0) {
                    value = (value >> 1) ^ polynomial;
                } else {
                    value >>= 1;
                }
                temp >>= 1;
            }
            table[i] = value;
        }
    }

    public static void main(String[] args) {
        CRC162 c = new CRC162();
        int[] arr = new int[]{0xFC, 0x05, 0x11};
        System.out.println(Integer.toHexString(c.ComputeChecksum(arr)));
    }

我明白了521

希望可以有人帮帮我。我需要它来与使用 ID003 协议的设备进行通信。

编辑: 使用此在线计算器http://www.lammertbies.nl/comm/info/crc-calculation.html http://www.lammertbies.nl/comm/info/crc-calculation.html对于输入 FC0511,我从 CRC-CCITT (Kermit) 直接得到 0x2756。


x^16 + x^12 + x^5 + 1 不是 0x1081。它是0x1021。 x^5 是 20,而不是 80。(请注意,x^16 被删除。)

此外,您需要的 Kermit CRC 已被反映,因此多项式被反转,给出 0x8408。

对于此 CRC,您用零进行初始化并且不对结果求反。

因此,相应地修改您的第一个示例,这会计算出您想要的内容:

public static void main(String[] args) {
    byte[] array = new byte[3];
    array[0] = (byte) 0xFC;
    array[1] = (byte) 0x05;
    array[2] = (byte) 0x11;
    //        array[3] = (byte) 0x00;
    //        array[4] = (byte) 0x00;

    System.out.println(Integer.toHexString(crc16(array)));
}

private static final int POLYNOMIAL = 0x8408;
private static final int PRESET_VALUE = 0;

public static int crc16(byte[] data) {
    int current_crc_value = PRESET_VALUE;
    for (int i = 0; i < data.length; i++) {
        current_crc_value ^= data[i] & 0xFF;
        for (int j = 0; j < 8; j++) {
            if ((current_crc_value & 1) != 0) {
                current_crc_value = (current_crc_value >>> 1) ^ POLYNOMIAL;
            } else {
                current_crc_value = current_crc_value >>> 1;
            }
        }
    }

    return current_crc_value & 0xFFFF;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中多项式x^16 + x^12 + x^5 + 1计算CCITT标准CRC 的相关文章

  • 在 mvn 命令中指定 pom.xml 并混合其他项目的目标

    我有多个问题 我可以在 mvn 命令中指定 pom xml 吗 在当前项目上执行 mvn 命令时 我可以混合另一个项目的目标吗 例如 mvn clean otherproject comple otherproject install ot
  • 如何将 javax.persistence.Column 定义为 Unsigned TINYINT?

    我正在基于 MySQL 数据库中的现有表创建 Java 持久性实体 Bean 使用 NetBeans IDE 8 0 1 我在这个表中遇到了一个字段 其类型为 无符号 TINYINT 3 我发现可以执行以下操作将列的类型定义为 unsign
  • Java Runtime.getRuntime().freeMemory() 问题

    我搜索并看到了一些线程 但没有一个能够解决我遇到的具体问题 我正在尝试使用以下方式监视我的内存使用情况Runtime getRuntime freeMemory Runtime getRuntime maxMemory and Runtim
  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • Spring RestTemplate 使用 cookie 遵循重定向

    最近我遇到了一个问题 我需要做一个GET请求远程服务 我假设使用一个简单的 servlet 并且 RestTemplate 返回Too many redirects 经过一番调查 似乎对指定远程服务发出的第一个请求实际上只是一个 302 重
  • Spring Boot自动装配存储库始终为空[重复]

    这个问题在这里已经有答案了 每次我进入我的服务类时 存储库似乎都没有自动连接 因为它不断抛出 NullPointerException 谁能帮我检查一下我缺少什么吗 这是我的代码 演示应用程序 java package com exampl
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • 如何在代理后面安装 Eclipse Neon

    对于 Neon Eclipse 附带了一个安装程序 我在安装程序中找不到任何配置菜单 我的java版本是 java version java version 1 8 0 72 Java TM SE Runtime Environment b
  • 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理

    我在控制器中有一个端点 它返回一个StreamingResponseBody 用于向客户端发送文件 其代码大致如下 RestController RequestMapping value api public class Controlle
  • ConcurrentHashMap 内部是如何工作的?

    我正在阅读有关 Java 并发性的 Oracle 官方文档 我想知道Collection由返回 public static
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • 如何检测 Java 字符串中的 unicode 字符?

    假设我有一个包含 的字符串 我如何找到所有这些 un icode 字符 我应该测试他们的代码吗 我该怎么做呢 例如 给定字符串 A X 我想将其转换为 AYXY 我想对其他 unicode 字符做同样的事情 并且我不想将它们存储在某种翻译映
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完
  • 将 Apache Camel 执行器指标发送到 Prometheus

    我正在尝试转发 添加 Actuator Camel 指标 actuator camelroutes 将交换 交易数量等指标 发送到 Prometheus Actuator 端点 有没有办法让我配置 Camel 将这些指标添加到 Promet
  • 泛型、数组和 ClassCastException

    我想这里一定发生了一些我不知道的微妙事情 考虑以下 public class Foo
  • 洪水填充优化:尝试使用队列

    我正在尝试创建一种填充方法 该方法采用用户指定的初始坐标 检查字符 然后根据需要更改它 这样做之后 它会检查相邻的方块并重复该过程 经过一番研究 我遇到了洪水填充算法并尝试了该算法 它可以工作 但无法满足我对 250 x 250 个字符的数

随机推荐

  • 在 Java 中访问包私有字段

    探究 Android API 源代码 有FileDescriptor与数据成员descriptor没有访问修饰符 int descriptor 然后就是上课了FileOutputStream构造一个新的 FileDescriptor 并分配
  • 使用 SQL Server 2016 时态表查询已删除记录的最佳方法是什么?

    我正在查看 SQL Server 2016 时态表 找不到任何有效的方法来查询现在已删除的所有历史记录 我不喜欢软删除或移动到 已删除项目表 因为我觉得临时表是多余的 这可以通过时态表以有效的方式实现吗 时态表旨在为您提供数据的时间点视图
  • Process.join() 和队列不适用于大量数据[重复]

    这个问题在这里已经有答案了 我正在尝试拆分 for 循环 即 N 1000000 for i in xrange N do something 使用 multiprocessing Process 并且它适用于较小的 N 值 当我使用更大的
  • 尝试使用 java EventHubClient API 将事件发送到 Azure 事件中心时出现“连接中止”错误

    我正在尝试编写一个java发布程序 以向事件中心发送一条消息 但是 当我尝试执行它时 我收到连接中止错误 我正在使用下面的链接 azure eventhubs 和0 9 0版本中指定的maven依赖项下面是我试图遵循的链接和主要方法 htt
  • SQLiteException:从数据库读取时无法识别的标记

    我已经在应用程序内创建了一个 SQLite 数据库 填充了它 现在我尝试从中读取数据 该应用程序不断崩溃 这是我收到的 logcat 12 30 05 53 18 008 E AndroidRuntime 6205 java lang Ru
  • Linux 上应用程序数据(非用户特定)的存储位置

    In my OSGi https en wikipedia org wiki OSGi基于 Java 应用程序 我正在开发一个捆绑包 为系统的其余部分提供对文件系统的访问权限 除了提供对用户主目录的访问之外 我还希望提供对非用户特定区域的访
  • 让背景颜色延伸到溢出区域

    如果总计内容高度父级的大小是 10 000px 但overflow auto元素是rendered高度为 700px 我如何强制aside子元素动态渲染为 10 000pxinstead默认 700px 当您开始滚动时 您可以看到白色背景小
  • 从图表中获取文本格式的路径

    在我的图表中 我有如下数据 这里 a b c d 是节点 r1 r2 r3 r4 是关系 a r1 gt b b r2 gt a b r2 gt c c r1 gt b d r3 gt a a r1 gt d like this 我正在使用
  • Xcode 7.0 启动图像集“LaunchImage”有 2 个未分配的子项

    我刚刚将 xcode 更新到 7 0 并修复了大部分错误 但我不断收到此错误消息 启动图像集 LaunchImage 有 2 个未分配的子项 我已经删除了两个未分配的子项 但仍然收到此错误消息 尝试深层清洁Xcode 命令 alt shif
  • 有两个输入的表单未提交?

    有人可以解释一下为什么这段代码不起作用 form on submit function e e preventDefault var first first val var next next val alert first next ht
  • 数据库中的原子比较和交换

    我正在研究工作排队解决方案 我想查询数据库中的给定行 其中状态列具有特定值 修改该值并返回该行 并且我想以原子方式执行此操作 以便其他查询不会看到它 begin transaction select from table where pk
  • 如何将我的数据随机分成不同的小批量 [JULIA]

    我有一个包含 100000 个示例的数据向量 值为 1 和 1 我想从这个数据中得到16 个不同的小批量随机 每6250个 这是我的代码 用于生成 100000 个示例的向量 并将其存储在文件中 Dan 回答了如何将我的数据划分为不同部分的
  • Reporting Services 2005 部署错误:无法加载文件或程序集

    我制作了一份关于 Reporting Services 2005 的报告 该报告使用外部程序集 我将该程序集添加到项目中 报告 报告属性 参考 我还将程序集复制到文件夹中 C Program Files Microsoft SQL Serv
  • hive 在一定数量后自动递增

    我需要将数据插入目标表 其中除代理键列外 所有列都应从不同的源表填充 它应该是目标表的最大值加上从 1 开始的自动增量值 我可以使用 row number 函数生成自动增量值 但在同一个查询中 我应该如何从目标表获取代理键的最大值 HIVE
  • Windows Metro 应用程序中的 CollectionViewSource

    我有一个集合 我需要 3 个不同的视图1 收集所有数据2 分组数据 分组标准将在应用程序生命周期中修改 3 过滤数据 过滤条件将在应用生命周期中修改 我想要的是所有视图都应该绑定到同一个集合 以便对集合的任何更改都应该同步到所有视图 对于
  • 访问 Service Fabric 中的文件系统

    当我从服务总线队列收到新消息时 我需要在 Service Fabric 服务中使用 ffmpeg 对视频进行编码 我可以从资源中提取 ffmpeg exe 并运行它 但我可以将输入 输出视频文件保存在内部文件系统中吗 我通过以下代码在本地集
  • 用于监视下载文件夹添加内容的批处理文件

    我需要一个批处理文件来监视 下载 文件夹中的添加内容 但仅限于新添加的内容 像这样的事情 START NumOldFiles GetNumberOfFilesOld Delay 30 Seconds NumNewFiles GetNumbe
  • ec2 API 如何决定哪个可用区?

    我正在编写一项服务 该服务可以根据需要以编程方式启动 EC2 实例 我想给它最好的机会能够随时启动实例 最大限度地减少由于容量不足而导致的失败 实例在一个区域内的哪个可用区中运行并不重要 重要的是我有最好的机会启动实例 我想知道 如果我在使
  • 什么正则表达式模式将匹配包含某些字符的整个单词?

    我想匹配包含某些字母 字符的整个单词 例如 该模式将匹配包含该字母的所有单词l and a 例如car patrol left等等 但它不会匹配这样的词boom turnover digit etc 像这样的模式应该有效 b w al w
  • Java中多项式x^16 + x^12 + x^5 + 1计算CCITT标准CRC

    我需要帮助在 Java 中使用多项式 x 16 x 12 x 5 1 0x1081 计算 CCITT 标准 CRC 我在互联网上尝试了很多示例 但每个示例都返回与示例中不同的值 例如 对于此数组 0xFC 05 11 结果需要为 27 56