字节数组到字符串和反向:恢复的字节数组与Java

时间:2015-06-22 18:43:09

标签: java string bytearray

我在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();

我感谢任何帮助。

此致

3 个答案:

答案 0 :(得分:8)

您无法将任意字节序列转换为String并期望反向转换起作用。您需要使用类似Base64的编码来保留任意字节序列。 (这可以从几个地方获得 - 内置于Java 8中,也可以从Guava和Apache Commons获得。)

例如,使用Java 8,

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

是可逆的

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

答案 1 :(得分:1)

作为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。

答案 2 :(得分:0)

指定编码可能会有所帮助,例如UTF-8。

String构造函数和getBytes都可以执行此操作,例如:

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

这应该导致相同的字节数组。

编辑:正如RealSkeptic指出的那样,您需要确定原始字节数组的编码,并使用它代替上述代码中的“UTF-8”。