java - 将 C 中的 crc8 函数转换为 Java

标签 java c crc

我从硬件合作伙伴那里收到了一个用 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/

相关文章:

c - 如何连接两个字符串并保存在 C 中的第三个变量中?

md5 - 我应该使用什么校验和算法?

c++ - 设备无法启动。 (代码 10)umdf 驱动程序开发错误

java - 如何使用旋转项目

java - PCFAgent 查询需要哪些权限?

java - Tomcat Web 应用程序调试数据库连接

c - 如何防止在 USB 传输中丢失数据?

C 中的 CRC 计算

c++ - 使用 qchecksum 而不是 boost crc16

Java 小程序在 Chrome 中不可见