Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将C中的crc8函数转换为Java_Java_C_Crc - Fatal编程技术网

将C中的crc8函数转换为Java

将C中的crc8函数转换为Java,java,c,crc,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)) {

我从硬件合作伙伴那里收到了一个用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\u bit!=0)

编辑:

我在转换方法中将代码改为byte。我从一个套接字接收数据,然后将其转换为一个字符串,从中获取字节数组

输入示例是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 == 0)
您确实需要使用字节,而不是短字符。要解决使用字节时遇到的问题,请使用以下命令

byte data_bit = (byte)0x80;

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

将代码转换为1:1,特别注意对字节执行的所有操作,以说明java隐式转换为int(例如:(byte>>>1)是绝对没有价值的,因为字节首先被扩展到int,移位,然后被回溯,使得它实际上是一个有符号移位(无论发生什么)

因此,最好将局部变量声明为int,并在从被屏蔽的bytearray加载时生成无符号扩展名:int x=字节[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在循环之前不会递减)。我怀疑原始代码(已经)被破坏了,或者对它的调用非常混乱。

它们在java中有字节吗?为什么会短路?如果(data_bit==0),最好使用字节。Java中的缩写是16位。我忘了C
int8
是否使用无符号移位,但您可能需要Java中的
>
来复制C
>
。您是否可以编辑您的问题,以包括一些示例输入、预期输出以及Java版本的输出?如果我使用if(data\u bit==0),然后我得到了一个无edless循环,因为它从未进入这个if。我使用short代替byte,因为byte data_bit=0x80;给出语法错误(类型不匹配)。我建议返回字节,然后重新回答您的问题。我不应该回答你的问题,我的机器上没有java。我不知道jack关于java的知识,但这似乎可以“byte b=(byte)0x80;”短裤在这个节目中对你不起作用。您需要使用字节。看这里
(int) crc == (byte) crc & 0xFF