在Java和C中生成CRC
这里是我的C代码在Java和C中生成CRC,java,c,crc32,Java,C,Crc32,这里是我的C代码 unsigned int crc32b(unsigned char *message) { int i, j; unsigned int byte, crc, mask; i = 0; crc = 0xFFFFFFFF; while (message[i] != 0) { byte = message[i]; // Get next byte. crc = crc ^ byte; for
unsigned int crc32b(unsigned char *message) {
int i, j;
unsigned int byte, crc, mask;
i = 0;
crc = 0xFFFFFFFF;
while (message[i] != 0) {
byte = message[i]; // Get next byte.
crc = crc ^ byte;
for (j = 7; j >= 0; j--) { // Do eight times.
mask = -(crc & 1);
crc = (crc >> 1) ^ (0xEDB88320 & mask);
}
i = i + 1;
}
return ~crc;
}
但在Java中,不支持unsignint。所以我尝试通过&0xFFFFFF获得unsign
但这是错误的。如何在java中修复它您可以轻松地用java中的有符号整数模拟大多数无符号算术(有些事情更烦人,例如除法,但这里不使用) 这特别容易,
0xFFFFFFFF
就是它本身,也称为-1
>
应替换为其未签名的对应项>
必须屏蔽消息中的字节
,才能撤消符号扩展
总计(未测试)
int crc32b(字节[]消息){
int i,j;
int b,crc,mask;
i=0;
crc=-1;
while(i=0;j--){//执行八次。
掩码=-(crc&1);
crc=(crc>>>1)^(0xEDB88320&掩码);
}
i=i+1;
}
返回~crc;
}
不过,这还是有点C风格。用Java显示您的代码,我们可能会帮助您;)这可能有助于:
int crc32b(byte[] message) {
int i, j;
int b, crc, mask;
i = 0;
crc = -1;
while (i < message.length) {
b = message[i] & 0xFF; // Get next byte.
crc = crc ^ b;
for (j = 7; j >= 0; j--) { // Do eight times.
mask = -(crc & 1);
crc = (crc >>> 1) ^ (0xEDB88320 & mask);
}
i = i + 1;
}
return ~crc;
}