我从硬件合作伙伴那里收到了一个用 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)
编辑:
我在转换方法中将代码更改为字节。我从一个套接字接收我的数据并将其转换为一个字符串,我从中得到一个 byteArray。
输入示例是 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();