首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将C语言CRC16转换为Java CRC16

将C语言CRC16转换为Java CRC16
EN

Stack Overflow用户
提问于 2012-11-03 20:51:19
回答 1查看 20.8K关注 0票数 8

我目前正在做一个项目,有一个嵌入式系统通过无线电向PC发送数据。数据包在最后得到一个crc16校验和,它是基于以下算法计算的:

代码语言:javascript
复制
uint16_t crc16 (const uint8_t * buffer, uint32_t size) {
    uint16_t crc = 0xFFFF;

    if (buffer && size)
        while (size--)
        {
            crc = (crc >> 8) | (crc << 8);
            crc ^= *buffer++;
            crc ^= ((unsigned char) crc) >> 4;
            crc ^= crc << 12;
            crc ^= (crc & 0xFF) << 5;
        }

    return crc;
}

现在我正在寻找Java中的等价物。我已经在这里找到了一个好的:http://introcs.cs.princeton.edu/java/51data/CRC16CCITT.java.html

代码语言:javascript
复制
public class CRC16CCITT { 

    public static void main(String[] args) { 
        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));
    }

}

但这不适用于我的C代码。

有没有人能够提供C和Java等价算法的改编或解决方案?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-03 20:59:26

在这种情况下,java和c之间的主要区别是,在c中,您使用无符号数字,而java只有有符号数字。虽然你可以用带符号的数字实现相同的算法,但你必须意识到符号位是在移位操作中进行的,这需要额外的"and“。

这是我的实现:

代码语言:javascript
复制
static int crc16(final byte[] buffer) {
    int crc = 0xFFFF;

    for (int j = 0; j < buffer.length ; j++) {
        crc = ((crc  >>> 8) | (crc  << 8) )& 0xffff;
        crc ^= (buffer[j] & 0xff);//byte to int, trunc sign
        crc ^= ((crc & 0xff) >> 4);
        crc ^= (crc << 12) & 0xffff;
        crc ^= ((crc & 0xFF) << 5) & 0xffff;
    }
    crc &= 0xffff;
    return crc;

}
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13209364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档