繁体   English   中英

将C中的crc8函数转换为Java

[英]Convert crc8 function in C to Java

我从硬件合作伙伴处收到了用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)

编辑:

我在转换方法中将代码更改为byte。 我从套接字接收数据并将其转换为String,我从中获取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();
if(!data_bit)

翻译成

if(data_bit == 0)

你真的需要使用字节而不是短路。 要解决使用字节的问题,请使用此方法

byte data_bit = (byte)0x80;

另外,正如马克所说,你需要使用>>>而不是>>。

翻译代码1:1,特别注意对字节进行的所有操作以解释java的隐式转换为int(例如(byte >>> 1)绝对没有价值,因为字节首先扩展到int,移位然后再转换回来,无论如何,使其成为有效的签名班次。

因此,局部变量最好声明为int,并且从掩码的bytearray加载以产生无符号扩展:int x = byte [i]&0xFF; 因为在唯一完成数据的位置已经被屏蔽到一个位(在if中),所以没有什么特别的事情要做。

应用于C代码产生:

int crc8(byte[] buf, int dataCount) {
    int crc = 0;
    int data_bit = 0x80;
    while(dataCount > 0) {
        if ( ((crc & 0x01)!=0) != ((buf[dataCount] & data_bit)!=0)) {
            crc >>= 1;
            crc ^= 0xCD;
        } else {
            crc >>= 1;
        }
        data_bit >>= 1;
        if (data_bit == 0) {
            data_bit = 0x80;
            dataCount--;
        }
    }
    return crc;
}

也就是说,代码效率不高(它逐位处理输入,有更快的实现处理整个字节,使用表添加每个可能的字节,但你可能不关心这个用例)。

另外,当你将这个方法的crc与一个字节进行比较时要小心,你必须用0xFF正确地屏蔽字节,否则对于> = 0x80的值,比较将失败:

(int) crc == (byte) crc & 0xFF

编辑:

担心的原始代码,data_byte显然是为了指定长度,首先它以相反的顺序计算,并且它将在指定的数字之后访问另一个字节(data_byte在循环之前不递减)。 我怀疑原来是(已经)破坏的代码,或者对它的调用是非常混乱的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM