【问题标题】:byte array to string and inverse : recoverded byte array is NOT match to original byte array in Java字节数组到字符串和逆:恢复的字节数组与Java中的原始字节数组不匹配
【发布时间】:2015-06-22 18:43:08
【问题描述】:

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

感谢您的帮助。

问候

【问题讨论】:

  • 这种转换的目的是什么?你想将你的字节数组作为字符串存储在某个地方还是只是出于好奇?
  • @sainaen,事实上原始和恢复的字节数组都是公钥。先将公钥转成字符串存入文件,读取公钥字符串值后,恢复公钥验证签名。
  • 哦,好吧,所以你可能正在使用类似 bouncycastle 的东西来做你的加密工作。您可能想尝试org.bouncycastle.util.encoders.Hex.toHexString()Hex.decode() 之类的方法——它们适用于任意二进制数据。
  • @sainaen,是的,没错。但我不知道如何在自己身上使用您的代码。如果您可以在我的代码中使用它,我将不胜感激。谢谢。
  • 啊,这不会很好地编码为 UTF-8 字符串,因为它是一堆随机数据。相反,您应该使用 Base64 对数据进行编码,如 Louis Wasserman 的答案或十六进制。

标签: java string bytearray


【解决方案1】:

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

例如,对于 Java 8,

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

可逆

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

【讨论】:

  • 你能给我举个例子吗?谢谢。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    String 构造函数和 getBytes 都可以让你这样做,例如:

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

    这应该产生相同的字节数组。

    编辑:正如 RealSkeptic 指出的那样,您需要弄清楚原始字节数组是哪种编码,并在上面的代码中使用它来代替“UTF-8”。

    【讨论】:

    • 仅当原始字节实际上是 UTF-8 时。
    • 无论哪种方式都应该可以工作,但如果字节不是 UTF-8,则字符串可能无法正确反映字节信息。如果您希望这种情况发生,只需将“UTF-8”更改为数组中字节的编码即可。
    • @Trent Small,情况更糟,连长度都不一样。结果如下: original: [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, 107, 38, -108, 75, 125, 75, -103, -70, 68, 103, -120, 78, 113, -98, -111、106、38、-125、-93、-102、-22、-37、30、25、61、-15、-90、-47、76、-25、16、-9、14、3 , 19, -115, 27, 39, -77, -55, -12, -54, 85, 69, -76, 53, -3, 94, -107, 124, 61, 100, 49, -21, -61、-21、-54、112、-47、-16、-50、-47、-106、-13]。
    • 恢复:[48, 89, 48, 19, 6, 7, 42, -17, -65, -67, 72, -17, -65, -67, 61, 2, 1 , 6, 8, 42, -17, -65, -67, 72, -17, -65, -67, 61, 3, 1, 7, 3, 66, 0, 4, 107, 38, -17, -65、-67、75、125、75、-17、-65、-67、-17、-65、-67、68、103、-17、-65、-67、78、113、-17、 -65、-67、-17、-65、-67、106、38、-17、-65、-67、-17、-65、-67、-17、-65、-67、-17、- 65, -67, -17, -65, -67, 30, 25, 61, -17, -65, -67, -17, -65, -67, 76, -17, -65, -67, 16 , -17, -65, -67, 14, 3, 19, -17, -65, -67, 27, 39, -17, -65, -67,
    • 继续:-17、-65、-67、-17、-65、-67、-17、-65、-67、85、69、-17、-65、-67、 53、-17、-65、-67、94、-17、-65、-67、124、61、100、49、-17、-65、-67、-17、-65、-67、-17 , -65, -67, -17, -65, -67, 112, -17, -65, -67, -17, -65, -67, -17, -65, -67, -47, -106 , -17, -65, -67]。
    猜你喜欢
    • 2011-10-04
    • 2015-03-19
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    相关资源
    最近更新 更多