Почему byteArray имеет длину 22 вместо 20? - PullRequest
47 голосов
/ 23 октября 2008

Мы пытаемся преобразовать строку в Byte[], используя следующий код Java:

String source = "0123456789";
byte[] byteArray = source.getBytes("UTF-16");

Мы получаем байтовый массив длиной 22 байта, мы не уверены, откуда этот заполнитель. Как мне получить массив длиной 20?

Ответы [ 4 ]

71 голосов
/ 23 октября 2008

Ответ Александра объясняет, почему он есть, а не как от него избавиться. Вам просто нужно указать порядковый номер, который вы хотите в названии кодировки:

String source = "0123456789";
byte[] byteArray = source.getBytes("UTF-16LE"); // Or UTF-16BE
25 голосов
/ 23 октября 2008

Первые два байта могут быть Порядком байтов . Он определяет порядок байтов в каждом 16-битном слове, используемом в кодировке.

7 голосов
/ 23 октября 2008

Попробуйте распечатать байты в шестнадцатеричном формате, чтобы увидеть, куда добавляются дополнительные 2 байта - они в начале или в конце?

Я выбираю, что вы найдете маркер порядка байтов в начале (0xFEFF) - это позволяет любому потребителю (получающему) байтовый массив распознавать, является ли кодировка с прямым порядком байтов или большой -endian.

6 голосов
/ 23 октября 2008

UTF имеет маркер порядка байтов в начале, который сообщает, что этот поток кодируется в определенном формате Как отмечали другие пользователи,
1-й байт 0XFE
2-й байт 0XFF
остальные байты
0
48
0
49
0
50
0
51
0
52
0
53
0
54
0
55
0
56
0
57

...