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

时间:2015-11-19 07:21:12

标签: java encoding bytearray biginteger

当我进行签名编码时,我遇到了一个陌生人的问题:

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

失败
//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

1 个答案:

答案 0 :(得分:2)

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

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

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