gpt4 book ai didi

java - java中带符号字节的CRC32

转载 作者:行者123 更新时间:2023-11-30 15:24:26 24 4
gpt4 key购买 nike

我正在尝试将 C CRC32 代码转换为 java。下面的代码是我想出的。但它的工作方式似乎有所不同。用 C 计算的预期 CRC32 是 13 82 D8 46),但以下代码的输出是“最终的 crc 是 -2084771805,十六进制 ffffffff83bce823”。谁能告诉我为什么?

C代码

uint32 crc32_update(uint32 crc, const uint8_t *data, uint16 data_len)
{

uint16_t tbl_idx;

while (data_len--) {
tbl_idx = crc ^ (*data >> (0 * 4));
crc = crc_table[tbl_idx & 0x0f] ^ (crc >> 4);
tbl_idx = crc ^ (*data >> (1 * 4));
crc = crc_table[tbl_idx & 0x0f] ^ (crc >> 4);

data++;
}
return crc & 0xffffffff;
}

JAVA代码。

public class crc32trial_3 {


static final long crc_table[] = new long[] {
0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
};



public static long crc32_init()
{
return 0xffffffff;
}

private static long crc32_update(long crc, byte[] data, int data_len)
{
int tbl_idx;

for(int i = 0 ; i < data_len ; i ++) {
tbl_idx = (int)crc ^ (data[i] >> (0 * 4));
crc = crc_table[tbl_idx & 0x0f] ^ (crc >> 4);
tbl_idx = (int)crc ^ (data[i] >> (1 * 4));
crc = crc_table[tbl_idx & 0x0f] ^ (crc >> 4);

//data++;
}

return crc & 0xffffffff;

}



public static void main(String args[])
{
long intialcrc = crc32_init();
long crc;


System.out.println("the intail crc = " + intialcrc);
byte[] packets = new byte[]{ 88,0,1,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,1,0,0,0,-1,-1,-1,-1,0,0,-56,-46,-117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-68,118 };

byte[] totalLenght = new byte[]{100,0,0,0};
byte[] totalSettingBlock = new byte[]{2};
crc = crc32_update(intialcrc,totalLenght,4);
crc = crc32_update(crc, totalSettingBlock,1);
int temp = 28 + 72;
crc = crc32_update(crc,packets, temp);
long finalcrc = crc;




System.out.println(" the final crc is " + finalcrc + " in hex " + Long.toHexString(finalcrc));

}


}

最佳答案

您需要在所有十六进制常量的末尾添加“L”。然后我得到 46d81382 作为结果,它接近,但你所说的排列是预期的。

关于java - java中带符号字节的CRC32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28405493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com