lession07 2024-05-17 17:21 采纳率: 20%
浏览 3

CRC32计算问题,求解决

使用Java计算出CRC32的数值,有参考的C代码,自己转换成Java之后一直报错

/**
 * @brief: crc32计算,软件计算,查表法
 * @param : *data:数据指针
 *          len:数据长度
 * @return: 校验值
 */
uint32_t crc32_run(uint8_t *data, uint16_t len, bool rest)
{
    static uint32_t crc = 0xffffffff;
    if (rest == true)
    {
        crc = 0xffffffff;
    }
    for (uint32_t i = 0; i < len; i++)
    {
        for (uint8_t j = 0; j < 3; j++)
        {
            crc = (crc << 8) ^ CRC32Table[(crc >> 24) ^ 0x00];
        }
        crc = (crc << 8) ^ CRC32Table[(crc >> 24) ^ data[i]];
    }
    return crc ^ 0x0;
}

改过很多版本也不行,

  public static int calc(byte[] ba, int len, Boolean cs) {
        int crc = 0xffffffff;
       if (cs == true)
       {
           crc = 0xffffffff;
       }
       for (int i = 0; i < len; i++)
       {
           for (int j = 0; j < 3; j++)
           {
               crc = (crc << 8) ^ crctab[(crc >> 24) ^ 0x00];
           }
           crc = (crc << 8) ^ crctab[(crc >> 24) ^ ba[i]];
       }
       return crc ^ 0x0;
   }

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-05-17 17:22
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    问题概括

    您提问的目的是解决在将C语言的CRC32计算代码转换成Java语言时遇到的问题。您希望得到一个正确的Java版本的CRC32计算方法。

    问题出现原因

    1. 数据类型不匹配:C语言中的uint32_t在Java中没有直接对应的类型,但通常可以使用int来表示32位的整数。
    2. 布尔值处理:在Java中,布尔值应使用boolean类型,而不是Boolean对象。
    3. 数组索引错误:在Java中,数组索引从0开始,而C语言中的数组索引也是从0开始,但是错误的循环次数可能导致数组越界或计算错误。
    4. 位操作:C语言中的位操作可能在Java中需要不同的表达方式。

    问题解决方案

    以下是修改后的Java代码,它应该能够正确地计算CRC32值:

    public class CRC32Calculator {
    
        // CRC32表,需要根据实际情况进行定义
        private static final int[] CRC32Table = {
            // ... 256个CRC32值
        };
    
        public static int calc(byte[] ba, int len, boolean cs) {
            int crc = 0xffffffff;
            if (cs) {
                crc = 0xffffffff;
            }
            for (int i = 0; i < len; i++) {
                crc = crc << 8;
                crc ^= CRC32Table[((crc >> 24) & 0xff) ^ ba[i]];
            }
            return crc ^ 0xffffffff;
        }
    
        public static void main(String[] args) {
            // 示例数据
            byte[] data = new byte[]{/* ... */};
            int len = data.length;
            boolean rest = true; // 如果需要重置CRC,设置为true
            int result = calc(data, len, rest);
            System.out.println("CRC32 Value: " + Integer.toHexString(result));
        }
    }
    

    提供代码

    上面的代码提供了一个完整的CRC32计算方法,包括必要的CRC32表的声明(需要您根据实际CRC32表填充)。

    代码运行方式

    1. 将上述代码复制到Java开发环境中。
    2. 确保CRC32表被正确填充。
    3. main方法中提供您需要计算的数据。
    4. 运行main方法。

    代码预期运行结果

    如果您提供了正确的CRC32表和数据,代码将输出计算得到的CRC32值。

    推荐相关链接

    请确保您使用的CRC32表是正确的,因为CRC32值依赖于特定的多项式和初始化值。上述代码中的CRC32Table数组需要您根据实际使用的CRC32算法填充相应的值。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月17日

悬赏问题

  • ¥100 需要跳转番茄畅听app的adb命令
  • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
  • ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗
  • ¥50 opencv4nodejs 如何安装
  • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument
  • ¥15 nginx反向代理获取ip,java获取真实ip
  • ¥15 eda:门禁系统设计
  • ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
  • ¥15 376.1电表主站通信协议下发指令全被否认问题
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证