当前位置: 首页 > 知识库问答 >
问题:

为[CRC16/IBM-SDLC]将C转换为Java

方鸿振
2023-03-14

这个示例程序是用C语言编写的。它用于生成基于CRC-16/IBM-SDLC的16位FCS编号。我正试图用Java编写相同的代码。有人能帮我做这件事或提供一些关于这件事的想法吗?我不懂C语言。

C language code:
unsigned short crcgen (data, length)
    char *data; /* address of the key */ 
    int length; /* key length   */
{
    unsigned char crcbytel, crcbyte2, r1; 
    char *ptr;
    int i;
    union byte_to_word
    {
        char bytes[2]; 
        unsigned short  ret;
    } return_val;
    ptr = data; 
    crcbyte1 = 0xFF 
    crcbyte2 = 0xFF
    for (i=0; i<length; i++)
    {
        r1 = *ptr++ ^ crcbyte2; 
        r1 = (r1 << 4) ^ r1;
        crcbyte2 = (r1 << 4) | (r1 >> 4); 
        crcbyte2 = (crcbyte2 & 0x0F ) ^ crcbyte1; 
        crcbyte1 = r1;
        r1 = (r1 << 3) | (r1 >> 5);
        crcbyte2 = crcbyte2 ^ (r1 & 0xF8);
         
        crcbyte1 = crcbyte1 ^ (r1 & 0x07);
    }
        
    return_val.bytes[0] = ˜crcbyte2; 
    return_val.bytes[1] = ˜crcbyte1; 
    return(return_val.ret);
}
  private static final int POLYNOMIAL   = 0x8408;
private static final int PRESET_VALUE = 0xFFFF;
public static void main(String[] args) throws IOException {
    // FileRead.read();
    int crc = 0xFFFF;          // initial value
    int polynomial = 0x1021;   // 0001 0000 0010 0001  (0, 5, 12)

    // byte[] testBytes = "123456789".getBytes("ASCII");

    byte[] buffer = "10530237".getBytes("ASCII");

    System.out.println(FileRead.crc16(buffer));
}

public static int crc16(byte[] data)
{
    int current_crc_value = PRESET_VALUE;
    for (int i = 0; i < data.length; i++ )
    {
        current_crc_value ^= data[i] & 0xFF;
        for (int j = 0; j < 8; j++)
        {
            if ((current_crc_value & 1) != 0)
            {
                current_crc_value = (current_crc_value >>> 1) ^ POLYNOMIAL;
            }
            else
            {
                current_crc_value = current_crc_value >>> 1;
            }
        }
    }
    current_crc_value = ~current_crc_value;

    return current_crc_value & 0xFFFF;
}

它返回34134而不是9588。

共有1个答案

戚繁
2023-03-14

你的翻译没有问题。这是因为您没有传递正确的“两个字节和十六进制形式”参数。将缓冲区更改为

byte[] buffer = {0x10, 0x53, 0x02, 0x37 };

顺便说一句,这可能有助于您处理字符串输入。

 类似资料:
  • 问题内容: 我目前正在从事一个项目,该项目的嵌入式系统通过无线电将数据发送到PC。数据包最后获得crc16校验和,并基于以下算法进行计算: 现在,我正在寻找Java中的等效语言。我已经在这里找到了一个不错的网站:http : //introcs.cs.princeton.edu/java/51data/CRC16CCITT.java.html 但这不适用于我的C代码。 是否有人能够为C和Java等

  • 我目前正在做一个项目,有一个嵌入式系统通过无线电向PC发送数据。数据包在最后得到一个crc16校验和,该校验和是基于以下算法计算的:

  • 问题内容: 有什么工具可以将C代码转换为Java代码?我有兴趣将此代码转换为Java: 问题答案: 您是否考虑过使用JNI来代替从C到Java的转换?

  • 我试图将Python程序转换为C++,因为我对Python的理解稍微好一点。然而,翻译出来的代码并不起作用。有人能帮我一下吗?我试图用C++制作一个数独板,但它在中返回一些值,而不是其他位置。加上它们是无效的,并包含0。 这个程序的输出是一个二维数组,所有值都不在0,并且对数独板有效: 是一个长度为9的二维数组,在每个位置都有9个列出的语句。在这里,它们都被初始化为。 这个程序的输出也是一个二维数

  • 问题内容: 我想创建一个包含我的类的实例变量的JSON字符串。 例如, 会成为: 我研究了几个用于创建JSON的C ++库,它们似乎都异常复杂。我想要类似Javascript的东西。换句话说,只需将std :: map传递给它并接收一个字符串。该地图可能包含其他地图,向量,列表,字符串,数字和布尔值。 最好的方法是什么? 谢谢你的帮助。 编辑 我研究了以下内容: json spirit,jsonc

  • 我有一个C#winform应用程序,将文件保存到sqlserver数据库(2014)到VAR二进制(MAX)字段 功能保存 要检索的函数 这工作很好,现在我已经要求将数据库转换为XML,用于未连接到服务器的PC 转换为XML的函数 它工作正常,除了二进制文件,当 输出XML 当尝试将其转换回图像时,它会给我1kb的文件,字符串不是实际图像 二进制字段有特殊的转换吗? 非常感谢。 编辑问题解决感谢@