3

我有一个这样初始化的字节数组:

public static byte[] tmpIV =  {0x43, (byte)0x6d, 0x22, (byte)0x9a, 0x22,
                         (byte)0xf8, (byte)0xcf, (byte)0xfe, 0x15, 0x21,
                         (byte)0x0b, 0x38, 0x01, (byte)0xa7, (byte)0xfc, 0x0e};

如果我打印它,它会给我

67   109    34      -102       34     -8          -49      -2      21      33
11    56    1       -89       -4      14

然后我将整个字节数组转换为字符串并发送给我的朋友。

String str = new String(tmpIV);

我的朋友是 C# 程序员

所以我的朋友得到了一些其他的数据。我的朋友将如何获得与我发送的相同数据。同样在Java中,如果我将上面的字符串重新转换为字节数组,我不会得到我发送的确切字符串:

 67     109        34        -17        -65      -67      34       -17     -65       -67
-17     -65        -67        -17         -65    -67      21       33    11     56      1
-17      -65      -67         -17       -65       -67   
4

3 回答 3

12

问题是您已将字节数组转换为平台默认编码中的字符串。

如果这是任意二进制数据(它似乎是),那么您不应该使用任何普通字符编码将其转换为字符串 - 改用 base64。

从 Java 中使用 base64 并不是特别容易(因为它不在标准库 AFAIK 中),但是您可以使用各种 3rd 方库,例如Apache Commons Codec library 中的那个

在 C# 方面它会容易得多 - 只需使用:

byte[] data = Convert.FromBase64String(text);
于 2009-05-21T06:35:29.367 回答
0

您必须确保您和您的朋友都使用相同的编码协议。因此,就 Java 而言,String aString = new String(byteArray)最好使用而不是使用String aString = new String(byteArray, Charset.forName("UTF-8"))(例如,如果你们都喜欢“UTF-8”)

PS:顺便说一句,您可能发现您朋友的字节数组多次出现以下模式“-17 -65 -67”。根据我的经验,这三个数字模式的意思是“?” UTF-8 中的字符

于 2013-01-05T22:54:02.170 回答
-4

我同意之前的回答 - 您应该使用 base64 方法,但使用 base64 很容易;)。只需使用sun.misc包中的 base64 实用程序类:

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;
import java.util.Arrays;
public class Base64Test {

    public static byte[] tmpIV = {0x43, (byte) 0x6d, 0x22, (byte) 0x9a, 0x22,
            (byte) 0xf8, (byte) 0xcf, (byte) 0xfe, 0x15, 0x21,
            (byte) 0x0b, 0x38, 0x01, (byte) 0xa7, (byte) 0xfc, 0x0e};


    public static void main(String[] args) {
        try {
            String encoded = new BASE64Encoder().encode(tmpIV);
            System.out.println(encoded);
            byte[] decoded = new BASE64Decoder().decodeBuffer(encoded);
            System.out.println(Arrays.equals(tmpIV,decoded));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
于 2009-05-21T09:44:40.180 回答