簡體   English   中英

字節數組到字符串和反向:恢復的字節數組與Java中的原始字節數組不匹配

[英]byte array to string and inverse : recoverded byte array is NOT match to original byte array in Java

我在Java中將字節數組轉換為字符串,如下所示:

String str_bytearray = new String(bytearray_original);

然后,我使用字符串恢復原始字節數組,如下所示:

byte[] bytearray_recovered = str_bytearray.getBytes();

但我想知道我什么時候比較了bytearray_original和bytearray_recovered。 結果如下:

[48, 89, 48, 19, 6, 7, 42, -122, 72, -50, 61, 2, 1, 6, 8, 42, -122, 72, -50, 61, 3, 1, 7, 3, 66, 0, 4, 100, -27, 48, -31, 13, -33, 107, -90, 91, -9, 119, 121, -73, 83, -105, 51, -87, -109, -84, 99, 115, -123, 119, -117, -1, -62, 71, -32, 99, 4, -103, -115, -47, 113, -83, 8, -91, 14, -74, 113, -40, -26, 50, 111, 95, 71, -9, 112, 120, 16, 0, 113, -80, 124, -71, 53, -97, 69, -85, 38, -112, -30, -110, 115]

[48, 89, 48, 19, 6, 7, 42, -122, 72, -50, 61, 2, 1, 6, 8, 42, -122, 72, -50, 61, 3, 1, 7, 3, 66, 0, 4, 100, -27, 48, -31, 13, -33, 107, -90, 91, -9, 119, 121, -73, 83, -105, 51, -87, -109, -84, 99, 115, -123, 119, -117, -1, -62, 71, -32, 99, 4, -103, 63, -47, 113, -83, 8, -91, 14, -74, 113, -40, -26, 50, 111, 95, 71, -9, 112, 120, 16, 0, 113, -80, 124, -71, 53, -97, 69, -85, 38, 63, -30, -110, 115]

如您所見,兩個字節與原始字節數組不同,即-115 to 63-112 to 63 有可能解決這個問題嗎?

注意:事實上,原始和恢復的字節數組都是公鑰。 第一個公鑰轉換為字符串存儲在一個文件中,然后在讀取公鑰的字符串值后,應該恢復它以驗證簽名。

bytearray_original生成如下:

PublicKey signPublicKey = keypair.getPublic(); 
byte [] bytearray_original = signPublicKey.getEncoded();

我感謝任何幫助。

問候

您不能將任意字節序列轉換為String並期望反向轉換起作用。 您將需要使用類似Base64的編碼來保留任意字節序列。 (這可以從幾個地方獲得 - 內置於Java 8中,也可以從Guava和Apache Commons獲得。)

例如,使用Java 8,

String encoded = Base64.getEncoder().encodeToString(myByteArray);

是可逆的

byte[] decoded = Base64.getDecoder().decode(encoded);

作為Louis Wasserman的答案的替代方案,只要您的項目中有BouncyCastle ,您就可以使用org.bouncycastle.util.encoders.Hex實用程序類:

import org.bouncycastle.util.encoders.Hex;
import java.util.Arrays;

class EncodingTest {
    public static void main(String[] args) {
        byte[] bytearray_original = new byte[]{48, 89, 48, 19, 6, 7, 42, -122, 72, -50, 61, 2, 1, 6, 8, 42, -122, 72, -50, 61, 3, 1, 7, 3, 66, 0, 4, 100, -27, 48, -31, 13, -33, 107, -90, 91, -9, 119, 121, -73, 83, -105, 51, -87, -109, -84, 99, 115, -123, 119, -117, -1, -62, 71, -32, 99, 4, -103, -115, -47, 113, -83, 8, -91, 14, -74, 113, -40, -26, 50, 111, 95, 71, -9, 112, 120, 16, 0, 113, -80, 124, -71, 53, -97, 69, -85, 38, -112, -30, -110, 115};
        String str_bytearray = Hex.toHexString(bytearray_original);
        byte[] bytearray_recovered = Hex.decode(str_bytearray);
        System.out.println("Results are equal: " + Arrays.equals(bytearray_original, bytearray_recovered));
    }
}

此選項需要外部庫,但它不需要Java 8。

指定編碼可能會有所幫助,例如UTF-8。

String構造函數和getBytes都可以讓你這樣做,例如:

String str_bytearray = new String(bytearray_original, "UTF-8");
byte[] bytearray_recovered = str_bytearray.getBytes("UTF-8");

這應該導致相同的字節數組。

編輯:正如RealSkeptic指出的那樣,您需要確定原始字節數組的編碼,並在上面的代碼中使用它代替“UTF-8”。

暫無
暫無

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

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