首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将C语言中的crc8函数转换为Java

将C语言中的crc8函数转换为Java
EN

Stack Overflow用户
提问于 2013-11-04 23:05:20
回答 2查看 2.3K关注 0票数 3

我从一个硬件合作伙伴那里收到了一个用C编写的CRC函数。他的设备发送的消息使用此代码签名。有人能帮我把它翻译成Java吗?

代码语言:javascript
运行
复制
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,但结果并不是我所期望的。

代码语言:javascript
运行
复制
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版本,但我的结果仍然无效。

这就是我读取数据的方式

代码语言:javascript
运行
复制
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();
EN

回答 2

Stack Overflow用户

发布于 2013-11-04 23:11:27

代码语言:javascript
运行
复制
if(!data_bit)

翻译为

代码语言:javascript
运行
复制
if(data_bit == 0)

你真的需要使用字节,而不是短字节。要解决使用字节时遇到的问题,请使用以下命令

代码语言:javascript
运行
复制
byte data_bit = (byte)0x80;

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

票数 2
EN

Stack Overflow用户

发布于 2013-11-05 01:40:45

因此,局部变量最好声明为int,并且当从一个字节数组加载时,掩码为产生无符号扩展名: int x= bytei & 0xFF;因为在唯一完成的位置,数据已经被掩码到单个位(在if中),没有什么特殊的事情要做。

应用于C代码会产生以下结果:

代码语言:javascript
运行
复制
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的比较将失败:

代码语言:javascript
运行
复制
(int) crc == (byte) crc & 0xFF

编辑:

甚至让我担心的是原始代码,data_byte显然是为了指定一个长度,首先它以相反的顺序计算,而且它将在指定的数字之后访问一个额外的字节(data_byte在循环之前不会递减)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19770622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档