Что происходит, когда строка преобразуется в байтовый массив - PullRequest
2 голосов
/ 21 августа 2011

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

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

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

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

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

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

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

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

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

Гас

Ответы [ 3 ]

3 голосов
/ 21 августа 2011

В 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.

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

0 голосов
/ 21 августа 2011

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

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

0 голосов
/ 21 августа 2011

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

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

...