我从硬件合作伙伴那里收到了一个用 C 语言编写的 CRC 函数。他的设备发送的消息使用此代码进行签名。谁能帮我把它翻译成 Java?
int8 crc8(int8*buf, int8 data_byte)
{
int8 crc=0x00;
int8 data_bit=0x80;
while(data_byte>0)
{
if(((crc&0x01)!=0)!=((buf[data_byte]&data_bit)!=0))
{
crc>>=1;
crc^=0xCD;
}
else
crc>>=1;
data_bit>>=1;
if(!data_bit)
{
data_bit=0x80;
data_byte--;
}
}
return(crc);
}
我尝试将其转换为 Java,但结果不是我所期望的。
public static byte crc8(byte [] buf, byte data_byte)
{
byte crc = 0x00;
byte data_bit = (byte)0x80;
while(data_byte>0)
{
if(((crc&0x01)!=0)!=((buf[data_byte]&data_bit)!=0))
{
crc>>=1;
crc^=0xCD;
}
else
{
crc>>=1;
}
data_bit>>=1;
if(data_bit == 0)
{
data_bit= (byte)0x80;
data_byte--;
}
}
return crc;
}
我想这是错误:if(data_bit != 0)
编辑:
我在我的转换方法中将代码更改为字节。我从套接字接收数据,然后将其转换为字符串,从中获取字节数组。
输入示例为 16, 0, 1, -15, 43, 6, 1, 6, 8, 0, 111, 0, 0 ,49 最后一个字段 (49) 应该是校验和
我也尝试了 Durandals 版本,但我的结果仍然无效。
我是这样读取数据的
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
char[] buffer = new char[14];
int count= bufferedReader.read(buffer, 0, 14);
String msg = new String(buffer, 0, count);
byte[] content = msg.getBytes();
最佳答案
if(!data_bit)
翻译成
if(data_bit == 0)
您确实需要使用字节而不是短裤。要解决使用字节时遇到的问题,请使用此
byte data_bit = (byte)0x80;
此外,正如 Mark 所说,您需要使用 >>> 而不是 >>。
关于java - 将 C 中的 crc8 函数转换为 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19770622/