gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:11:04 25 4
gpt4 key购买 nike

当我进行签名编码时,我遇到了一个奇怪的问题:

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

//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 将忠实地再现数字,但它并不意味着成为通用的二进制到十六进制转换器。特别是,它将丢失前导零,因为在将数据视为整数时它们是微不足道的。 (如果您知道预期的长度,您总是可以将其格式化为该长度,但为什么要麻烦呢?只需将数据视为任意数据而不是数字。)

绝对不要尝试将字节数组当作 UTF-8 编码文本来“解码” - 事实并非如此。

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

关于java - 使用 bigInteger 和其他方法重建字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33797502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com