安卓中的CRC32哈希值错误

4
我正在使用下面的代码计算CRC32哈希值。
CRC32 crc = new CRC32();
crc.update(str.getBytes());
String enc = Long.toHexString(crc.getValue()); 

我的问题是在输出(enc)中,如果第一个字符是“0”,它会删除该零,最终我将得到一个7个字符长的十六进制字符串。有人能告诉我如何在第一个字符为“0”时获得完整的8个字符长的十六进制字符串吗?


你根本没有得到“错误的CRC”。你只是缺少一个前导零。数值是正确的。前导零不会改变数值。 - user207421
2个回答

3
根据toHexString的Java文档,这是预期的行为:
此值将转换为十六进制(基数为16)的ASCII数字字符串,没有额外的前导0。
有许多方法可以实现它,例如在字符串开头添加一个前导零字符,直到达到所需的长度,但另一种方法是使用String.format方法,它允许使用C样式格式规范:
String enc = String.format("%08X", crc.getValue());

这是一个完整的Java编程示例,其中包括带前导零的计算:
import java.util.zip.CRC32;
import java.util.zip.Checksum;

public class HelloWorld{
     public static void main(String []args){
        String str = "c";
        CRC32 crc = new CRC32();
        crc.update(str.getBytes());
        String enc = String.format("%08X", crc.getValue());
        System.out.println(enc);
     }
}

谢谢你的回答...我也在使用同样的概念来检查字符串长度并添加'0',直到达到所需的长度... - akh

1

你好,请看这里。对我来说它是有效的,请尝试一下。

import java.util.zip.CRC32;
import java.util.zip.Checksum;

public class CalculateCRC32ChecksumForByteArray {

    public static void main(String[] args) {

        String input = "Java Code Geeks - Java Examples";

        // get bytes from string
        byte bytes[] = input.getBytes();

        Checksum checksum = new CRC32();

        // update the current checksum with the specified array of bytes
        checksum.update(bytes, 0, bytes.length);

        // get the current checksum value
        long checksumValue = checksum.getValue();

        System.out.println("CRC32 checksum for input string is: " + checksumValue);

    }

}

我的问题是,当使用toHexString()方法将checkSumValue转换为十六进制字符串时,它会给我一个7个字符长的十六进制字符串。但是,当我在在线crc32生成器上检查它时,它会给我一个以'0(零)'开头的8个字符长的十六进制字符串,其余7个字符相同。因此,在转换checkSumValue时,“0”被截断,导致7个字符的十六进制字符串...我该如何解决这个问题? - akh
嗨,我有点困惑,但请看一下http://examples.javacodegeeks.com/core-java/security/calculate-the-crc-sum-of-a-file/,希望它能帮到你。 - Jitesh Upadhyay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接