用 bigInteger 和其他方法重建字节数组

Rebuild byte array with bigInteger and other method

我在做签名编码的时候遇到了一个奇怪的问题:

当我想重建一个字节数组时,总是失败:

//digest is the original byte array
        String messageHex = bytesToHex(digest);
        byte[] hexRestore = messageHex.getBytes();
        assert Arrays.equals(digest, hexRestore);   //false!    

        String utf8Digest = new String(digest, "UTF8");
        byte[] utf8Restore = utf8Digest.getBytes("UTF8");
        assert Arrays.equals(digest, utf8Restore);    //false!

然后我使用大整数:

        BigInteger messageBig = new BigInteger(digest);
        byte[] bigRestore = messageBig.toByteArray();
        assert Arrays.equals(digest, bigRestore));    //true!

然后就可以了,不知道为什么,c

不要使用这两种方法中的任何一种。直接转换为十六进制(不使用 BigInteger)或使用 base64。 BigInteger 将忠实地再现 数字 ,但它并不意味着是一个通用的二进制到十六进制转换器。特别是,它将丢失前导零,因为在将数据 视为整数 时它们是微不足道的。 (如果您知道预期的长度,您总是可以将其格式化为该长度,但何必呢?只需将数据视为任意数据而不是数字。)

绝对不要尝试 "decode" 字节数组就好像它是 UTF-8 编码的文本一样 - 它不是。

Stack Overflow 上有很多关于将字节数组转换为 hex or base64 的问题。 (这些只是指向两个示例的链接...搜索更多。)