2011-08-21 4 views
2

Я думаю, что это вопрос типа новичков, но я это совершенно понял.Что происходит, когда строка преобразуется в массив байтов

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

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

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

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

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

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

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

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

Гас

ответ

2

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

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

Например, предположим, что мы имеем строку 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.

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

+0

Я думаю, что я лучше разбираюсь в этом. В основном моя задача - передать ключ шифрования между медиа-сервером Wowza и сказать веб-страницу с защищенным носителем на iPad. Инструкции Wowza: .. Ключевая информация должна быть отправлена ​​как упакованный массив из 16 октетов в двоичный формат: Еще раз спасибо всем, что я очень ценю вашу помощь. –

0

Строка кодируется в ByteArray в соответствии с Charset. Кодовая кодировка может кодировать символ более или менее, а затем - байты.

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

+0

Я понимаю концепцию представления символа как числа через набор символов. Выполняет ли следующая логика. 0 байт = ba string = abc преобразовать 'a' в число, представляющее 'a' ba [1] = представительское число для 'a'; новообращенный «б» на число, представляющее «B» ба [2] = представительное число для «Ъ» и т.д. через строку ... BTW спасибо за ваше время –

+0

По вашему примеру, ба [1] не в абсолютном представлении первого символа. Это необходимо, если у вас есть кодировка с 1 char = 1 байт. abc [1] - первый символ, и вы можете преобразовать его в байт. ba [1] вместо этого является первым байтом закодированного значения. –

0

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

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