【问题标题】:Rebuild byte array with bigInteger and other method用 bigInteger 和其他方法重建字节数组
【发布时间】:2016-02-21 05:14:28
【问题描述】:

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

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

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

【问题讨论】:

    标签: java encoding bytearray biginteger


    【解决方案1】:

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

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

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

    【讨论】:

    • 我也尝试过你帖子中的十六进制方法,但它也不起作用,我也想知道为什么......我还将代码添加到问题中
    • @Haven:你打电话给String.getBytes。这不是您将十六进制转换回字节数组的方式。您正在以默认编码获得该文本的表示形式...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多