Проблемы с конвертацией byte array в String и обратно Java
Почему после конвертации в String и обратно меняется массив byte. при чем такое происходит не с каждым массивом байт, вот пример кода который это демонстрирует.
byte[] result = new byte[]
{0, 0, 0, 97, 63, -44, 55, -19, 51, 16, -39, -106, 0, 0, 0,
18, 0, 0, 0, 9, 0, 63, -32, 0, 0, 0, 0, 0, 0, 32, 63, -84,
113, -57, 28, 113, -57, 28, 114, 63, -84, 113, -57, 28, 113,
-57, 28, 115, 63, -84, 113, -57, 28, 113, -57, 28, 100, 63,
-84, 113, -57, 28, 113, -57, 28, 117, 63, -84, 113, -57, 28,
113, -57, 28, 108, 63, -84, 113, -57, 28, 113, -57, 28, 109,
63, -84, 113, -57, 28, 113, -57, 28, 111, 63, -68, 113, -57,
28, 113, -57, 28, 0};
byte[] result2 = new byte[]
{0, 0, 0, 115, 63, -29, -103, 75, 42, 114, -97, 67, 0, 0, 0,
18, 0, 0, 0, 11, -1, 63, -84, 113, -57, 28, 113, -57, 28, 0,
63, -36, 113, -57, 28, 113, -57, 28, 32, 63, -84, 113, -57,
28, 113, -57, 28, 112, 63, -84, 113, -57, 28, 113, -57, 28,
-2, 63, -84, 113, -57, 28, 113, -57, 28, 114, 63, -84, 113,
-57, 28, 113, -57, 28, 101, 63, -84, 113, -57, 28, 113, -57,
28, 105, 63, -84, 113, -57, 28, 113, -57, 28, 76, 63, -84,
113, -57, 28, 113, -57, 28, 109, 63, -84, 113, -57, 28, 113,
-57, 28, 111, 63, -84, 113, -57, 28, 113, -57, 28, 0};
try {
Object data = new String(result, "UTF-16BE");
byte[] workingData = ((String) data).getBytes("UTF-16BE");
Object data2 = new String(result2, "UTF-16BE");
byte[] workingData2 = ((String) data2).getBytes("UTF-16BE");
System.out.println(Arrays.equals(result, workingData));
System.out.println(Arrays.equals(result2, workingData2));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Ответы (1 шт):
Метод getBytes отработал очень криво в первом случае. По моему скромному мнению, плохо он отработал, потому что у вас включена (как и у меня) UTF-8. И вы конвертируете в какие-то иероглифы. Для корректной конвертации нужно включить какую-то другую кодировку. Вот гляньте:
System.out.println("data = " + data);
System.out.println("data2 = " + data2);
OUTPUT:
data = a㿔㟭㌐� ? 㾬燇ᱱ윜爿걱윜燇ᱳ㾬燇ᱱ윜搿걱윜燇ᱵ㾬燇ᱱ윜氿걱윜燇ᱭ㾬燇ᱱ윜漿뱱윜燇ᰀ
data2 = s㿣饋⩲齃 _걱윜燇ᰀ㿜燇ᱱ윜‿걱윜燇ᱰ㾬燇ᱱ윜︿걱윜燇ᱲ㾬燇ᱱ윜政걱윜燇ᱩ㾬燇ᱱ윜䰿걱윜燇ᱭ㾬燇ᱱ윜漿걱윜燇ᰀ
В первом случае у вас строка, где часть символов комп не прочитал выведя ?. Во втором комп вывел нам нормальные иероглифы. Чтобы показать что ваш getBytes отработал плохо я записал такую вот вещь:
public class ByteDiff { //Класс для записи двух различных байтов в массив
byte a;
byte b;
int pos;
public ByteDiff(byte a, byte b, int pos) {
this.a = a;
this.b = b;
this.pos = pos;
}
@Override
public String toString() {
return "pos " + pos + " first byte:" + a + "; second byte: " + b;
}
}
//Метод сравнения двух массивов байт и записи разности
static ArrayList<ByteDiff> disagree(byte [] one, byte [] two){
System.out.println("Первый длина" +one.length + " второй длина " + two.length);
ArrayList <ByteDiff> bf = new ArrayList<>();
if(one.length!=two.length) {
System.out.println("Массивы не равны.");
}
for(int i=0; i<one.length&&i<two.length;i++){
if(one[i]!=two[i]){
bf.add(new ByteDiff(one[i], two[i], i));
}
}
return bf;
}
ArrayList <ByteDiff> bs = disagree(result, workingData);// Вызов метода сравнения двух массивов
bs.stream().forEach(b-> System.out.println(b)); //распечатка массива сравнения
OUTPUT: Массивы не равны. Первый длина 102 второй длина 100
pos 10 first byte:-39; second byte: -1
pos 11 first byte:-106; second byte: -3
pos 13 first byte:0; second byte: 18
pos 15 first byte:18; second byte: 0
pos 17 first byte:0; second byte: 9
pos 19 first byte:9; second byte: 63
pos 20 first byte:0; second byte: -32
pos 21 first byte:63; second byte: 0
pos 22 first byte:-32; second byte: 0
pos 27 first byte:0; second byte: 32
pos 28 first byte:0; second byte: 63
pos 29 first byte:32; second byte: -84
pos 30 first byte:63; second byte: 113
pos 31 first byte:-84; second byte: -57
pos 32 first byte:113; second byte: 28
pos 33 first byte:-57; second byte: 113
pos 34 first byte:28; second byte: -57
pos 35 first byte:113; second byte: 28
pos 36 first byte:-57; second byte: 114
pos 37 first byte:28; second byte: 63
pos 38 first byte:114; second byte: -84
pos 39 first byte:63; second byte: 113
pos 40 first byte:-84; second byte: -57
pos 41 first byte:113; second byte: 28
pos 42 first byte:-57; second byte: 113
pos 43 first byte:28; second byte: -57
pos 44 first byte:113; second byte: 28
pos 45 first byte:-57; second byte: 115
pos 46 first byte:28; second byte: 63
pos 47 first byte:115; second byte: -84
pos 48 first byte:63; second byte: 113
pos 49 first byte:-84; second byte: -57
pos 50 first byte:113; second byte: 28
pos 51 first byte:-57; second byte: 113
pos 52 first byte:28; second byte: -57
pos 53 first byte:113; second byte: 28
pos 54 first byte:-57; second byte: 100
pos 55 first byte:28; second byte: 63
pos 56 first byte:100; second byte: -84
pos 57 first byte:63; second byte: 113
pos 58 first byte:-84; second byte: -57
pos 59 first byte:113; second byte: 28
pos 60 first byte:-57; second byte: 113
pos 61 first byte:28; second byte: -57
pos 62 first byte:113; second byte: 28
pos 63 first byte:-57; second byte: 117
pos 64 first byte:28; second byte: 63
pos 65 first byte:117; second byte: -84
pos 66 first byte:63; second byte: 113
pos 67 first byte:-84; second byte: -57
pos 68 first byte:113; second byte: 28
pos 69 first byte:-57; second byte: 113
pos 70 first byte:28; second byte: -57
pos 71 first byte:113; second byte: 28
pos 72 first byte:-57; second byte: 108
pos 73 first byte:28; second byte: 63
pos 74 first byte:108; second byte: -84
pos 75 first byte:63; second byte: 113
pos 76 first byte:-84; second byte: -57
pos 77 first byte:113; second byte: 28
pos 78 first byte:-57; second byte: 113
pos 79 first byte:28; second byte: -57
pos 80 first byte:113; second byte: 28
pos 81 first byte:-57; second byte: 109
pos 82 first byte:28; second byte: 63
pos 83 first byte:109; second byte: -84
pos 84 first byte:63; second byte: 113
pos 85 first byte:-84; second byte: -57
pos 86 first byte:113; second byte: 28
pos 87 first byte:-57; second byte: 113
pos 88 first byte:28; second byte: -57
pos 89 first byte:113; second byte: 28
pos 90 first byte:-57; second byte: 111
pos 91 first byte:28; second byte: 63
pos 92 first byte:111; second byte: -68
pos 93 first byte:63; second byte: 113
pos 94 first byte:-68; second byte: -57
pos 95 first byte:113; second byte: 28
pos 96 first byte:-57; second byte: 113
pos 97 first byte:28; second byte: -57
pos 98 first byte:113; second byte: 28
pos 99 first byte:-57; second byte: 0