用 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 的问题。 (这些只是指向两个示例的链接...搜索更多。)
我在做签名编码的时候遇到了一个奇怪的问题:
当我想重建一个字节数组时,总是失败:
//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 的问题。 (这些只是指向两个示例的链接...搜索更多。)