преобразование байта [] в строку в байтовый массив не работает нормально в Java - PullRequest
3 голосов
/ 21 мая 2009

У меня байтовый массив инициализирован так:

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   

Ответы [ 3 ]

12 голосов
/ 21 мая 2009

Проблема в том, что вы преобразовали байтовый массив в строку в кодировке платформы по умолчанию.

Если это произвольные двоичные данные (которые, по-видимому, являются), то вам не следует использовать любую нормальную кодировку символов для преобразования ее в строку - вместо этого используйте base64.

Использование base64 из Java нелегко , в частности (потому что это не входит в стандартные библиотеки AFAIK), но вы можете использовать различные сторонние библиотеки, такие как в Apache Commons Библиотека кодеков .

На стороне C # это будет намного проще - просто используйте:

byte[] data = Convert.FromBase64String(text);
0 голосов
/ 06 января 2013

Вы должны убедиться, что вы и ваш друг используете один и тот же протокол кодирования. Следовательно, с точки зрения Java вместо String aString = new String(byteArray) лучше использовать String aString = new String(byteArray, Charset.forName("UTF-8")) (например, если вы оба предпочитаете "UTF-8")

PS: Кстати, вы, вероятно, обнаружили, что байтовый массив вашего друга несколько раз имеет следующий шаблон "-17 -65 -67". По моему опыту, эти три числа означает «?» символ в UTF-8

0 голосов
/ 21 мая 2009

Я согласен с предыдущим ответом - вы должны использовать подход base64, но использовать base64 легко;). Просто используйте базовые классы base64 из пакета sun.misc :

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();
        }
    }
}
...