簡體   English   中英

使用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將忠實地再現數字 ,但這並不意味着它是通用的二進制轉十六進制轉換器。 特別是,它將丟失前導零,因為當將數據視為整數時,它們是無關緊要 (如果知道預期的長度,可以始終將其格式化為該長度,但是為什么要麻煩呢?只需將數據視為任意數據而不是數字即可。)

絕對不要嘗試將字節數組“解碼”為好像它是UTF-8編碼的文本-事實並非如此。

關於堆棧溢出,有很多關於將字節數組轉換為十六進制base64的問題 (這些只是到兩個示例的鏈接...搜索更多。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM