Что происходит, когда строка преобразуется в массив байтов

Я думаю, что это вопрос типа новичка, но я вполне это понял.

Я могу найти много сообщений о том, как преобразовать строку в массив байтов на разных языках.

Чего я не понимаю, так это того, что происходит в характере за персонажем. Я понимаю, что каждый символ, отображаемый на экране, представлен числом, таким как его код ascii. (Можем ли мы сейчас придерживаться ASCII, чтобы я понял это концептуально :-))

Означает ли это, что когда я хочу представить символ или строку (которая представляет собой список диаграмм), происходит следующее

Преобразовать символ в значение ASCII> представить значение ascii как двоичное?

Я видел код, который создает массивы байтов, определяя массив байтов как 1/2 длины входной строки, поэтому наверняка массив байтов будет такой же длины строки?

Так что я немного смущен. В основном я пытаюсь сохранить значение sting в массиве байтов в ColdFusion, который, как я не вижу, имеет явную функцию строкового массива байтов.

Однако я могу добраться до базовой Java, но мне нужно знать, что происходит на теоретическом уровне.

Заранее спасибо и, пожалуйста, скажите мне красиво, если вы думаете, что я лаю с ума !!

Гас


person Gus D    schedule 21.08.2011    source источник


Ответы (3)


В Java строки хранятся в виде массива 16-битных значений char. Каждый символ Unicode в строке хранится как одно или (реже) два значения char в массиве.

Если вы хотите сохранить некоторые строковые данные в массиве byte, вам нужно будет иметь возможность преобразовывать символы Unicode строки в последовательность байтов. Этот процесс называется кодированием, и существует несколько способов сделать это. с разными правилами и результатами. Если две части кода хотят совместно использовать строковые данные с помощью байтовых массивов, им необходимо согласовать используемую кодировку.

Например, предположим, что у нас есть строка s, которую мы хотим закодировать с помощью UTF-8. кодировка. UTF-8 имеет удобное свойство: если вы используете его для кодирования строки, содержащей только символы ASCII, каждый символ во входных данных преобразуется в один байт со значением ASCII этого символа. Мы могли бы преобразовать нашу строку Java в массив байтов Java следующим образом:

byte[] bytes = s.getBytes("UTF-8");

Массив байтов bytes теперь содержит строковые данные из s, закодированные в байты с использованием кодировки UTF-8.

Теперь мы где-то сохраняем или передаем байты, а код на другом конце хочет декодировать байты обратно в Java String. Он будет делать что-то вроде следующего:

String t = new String(bytes, "UTF-8");

Предполагая, что ничего не произошло, строка t теперь содержит те же строковые данные, что и исходная строка s.

Обратите внимание, что обе части кода должны были согласовать используемую кодировку. Если они не согласны, результирующая строка может содержать мусор или даже может не декодироваться на все.

person Stuart Cook    schedule 21.08.2011
comment
Думаю, я лучше разбираюсь в этом. По сути, моя задача состоит в том, чтобы передать ключ шифрования между медиасервером Wowza и, скажем, веб-страницей с защищенным медиафайлом на iPad. Инструкции Wowza таковы. Информация о ключе должна быть отправлена ​​в виде упакованного массива из 16 октетов в двоичном формате: Спасибо. еще раз всем, я очень ценю вашу помощь. - person Gus D; 21.08.2011

Вы не лаете с ума. Ключ, который нужно помнить во всех вопросах, связанных со строками, заключается в том, что для компьютера символы не существуют, существуют только числа. Нет такой вещи, как символ, строка, текст или что-то подобное, которые на самом деле не были бы реализованы посредством хранения чисел (на самом деле это относится ко всем типам данных: логические значения — это действительно числа с очень небольшим диапазоном, перечисления — это внутренние числа и т. д.) Это Вот почему бессмысленно говорить, что часть данных представляет собой «A» или любой другой символ, вы должны знать, какую кодировку символов предполагает окружающий код.

Преобразование строк в байтовые массивы происходит именно на этой границе между преднамеренной перспективой («Это должно быть напечатано как 'A'») и внутренней перспективой («Эта ячейка памяти содержит 65»). Поэтому, чтобы получить правильный результат, вы должны конвертировать между ними в соответствии с одним из нескольких возможных наборов символов, и выбрать правильный. Обратите внимание, что JDK предлагает удобные методы, которые не требуют имени набора символов и всегда используют набор символов по умолчанию, выведенный из вашей платформы и переменных среды; но почти всегда лучше знать, что вы делаете, и явно указывать кодировку, а не кодировать что-то, что работает сегодня и таинственным образом дает сбой, когда вы выполняете это на другой машине.

person Kilian Foth    schedule 21.08.2011

Строка кодируется в bytearray в соответствии с кодировкой. Набор символов может кодировать char в большее или меньшее количество битов, а затем в байты.

Например, если вам нужно отображать только шифры (10 разных символов), вы можете использовать набор символов, определяющий 4 бита на символ, получая представление 2 символа на байт. Кодировка ОС часто выбирается по умолчанию в кодировщиках String to byteArray. Чтобы вернуть строку, вы должны декодировать эту строку с той же кодировкой.

person Andrea Colleoni    schedule 21.08.2011
comment
Я понимаю концепцию представления символа в виде числа через набор символов. Работает ли следующая логика. массив байтов =ba string = abc преобразовать 'a' в число, представляющее 'a' ba[1] = репрезентативное число для 'a'; преобразовать 'b' в число, представляющее 'b' ba[2] = репрезентативное число для 'b' и т. д. через строку... кстати, спасибо за ваше время - person Gus D; 21.08.2011
comment
Согласно вашему примеру, ba[1] не является абсолютным представлением первого символа. Это должно быть, если у вас есть кодировка с 1 символом = 1 байт. abc[1] — это первый символ, и вы можете преобразовать его в байт. ba[1] вместо этого является первым байтом закодированного значения. - person Andrea Colleoni; 21.08.2011