java 中的 CRC-CCITT 验证 (android)

发布于 2024-11-12 06:23:39 字数 1234 浏览 4 评论 0 原文

你好 我通过蓝牙连接接收了一些数据。 该数据有一个 16 位 CRC 16-CCITT 块,我想使用它来验证数据是否已成功传输且没有错误。 java或android中是否有任何内置方法可以帮助我,或者我需要自己实现它?我需要对数据进行编码并进行比较吗?我有一个在网上找到的代码片段,但我不确定它是否正确或有效。 它位于: http://introcs.cs.princeton.edu/ java/51data/CRC16CCITT.java.html 代码是:

    int crc = 0xFFFF;          // initial value
    int polynomial = 0x1021;   // 0001 0000 0010 0001  (0, 5, 12) 

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

    byte[] bytes = args[0].getBytes();

    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;
    System.out.println("CRC16-CCITT = " + Integer.toHexString(crc));

我还看到Java在http://download.oracle.com/javase /1.4.2/docs/api/java/util/zip/CRC32.html。这是我可以在这里使用的东西吗?

谢谢。

Hi
I have some data being received over a bluetooth connection.
The data has a 16-bit CRC 16-CCITT block which I want to use in order to verify that the data was transferred successfully and without error.
Is there any built in method in java or android that can help me or do I need to implement it myself? Will I need to encode the data and compare? I have a code snippet for doing that which I found online, but I'm not sure it is correct or efficient.
It is found at: http://introcs.cs.princeton.edu/java/51data/CRC16CCITT.java.html and the code is:

    int crc = 0xFFFF;          // initial value
    int polynomial = 0x1021;   // 0001 0000 0010 0001  (0, 5, 12) 

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

    byte[] bytes = args[0].getBytes();

    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;
    System.out.println("CRC16-CCITT = " + Integer.toHexString(crc));

I also saw that Java has an implementation of crc32 at http://download.oracle.com/javase/1.4.2/docs/api/java/util/zip/CRC32.html. Is that something I can use here?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

疏忽 2024-11-19 06:23:39

这是非常低效的。 Internet 上有一个最初在 20 世纪 80 年代用 C 语言编写的表驱动版本,运行速度至少是原来的 8 倍。 维基百科文章似乎提供了一些链接。

It is very inefficient. There is a table-driven version around the Internet written originally in C in the 1980s that runs at least 8 times as fast. The Wikipedia article appears to provide some links.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文