Android string from bytes

Содержание
  1. 2 примера для преобразования массива Byte [] в строку в Java
  2. Как преобразовать byte [] в строку в Java
  3. Byte to String conversion in Java – 5 ways
  4. Various ways to convert Byte to String
  5. Way 1: Using Byte.toString(byteVal); method
  6. Way 2: Using String.valueOf(byteVal); method
  7. Way 3: create Byte object and then convert to String using toString() method Here, we will create new Byte object with primitive byte value as constructor-argument After creating new Byte object by passing primitive byte value, then invoke toString() method for converting primitive byte data-type to String object Method signature: ConvertByteToStringUsingObjectCreation.java Output: Way 4: adding double quotes (“”) to byte value Note: for this conversion to work, double-quotes (“”) must be added at the start of the concatenation Syntax: ConvertByteToStringByAddingDoubleQuotes.java Output: Way 5: Using append() method of StringBuffer & StringBuilder This method can be used to convert primitive byte data-type to String object by appending to StringBuffer or StringBuilder object And then invoking toString() method Syntax: ConvertByteToStringByAppending.java Output: Auto-boxing of Byte wrapper-type to primitive byte data-type and vice-versa Auto-boxing feature available from Java 1.5 version So, converting primitive data-type to wrapper-type can easily be done, by directly assigning Let’s see one example based on this auto-boxing feature AutoBoxingFeatureForByteConversion.java Output: Hope, you found this article very helpful. If you have any suggestion or want to contribute any other way or tricky situation you faced during Interview hours, then share with us. We will include that code here. Источник String from byte с UTF-8 дает разные результаты на Android, чем на Windows JVM Я пытаюсь преобразовать массив байтов в строку в Java со следующим кодом: Проблема в том, что я получаю другой результат, если я запускаю код в Windows (JVM 1.8.0_112), чем если бы я запускал его в своем устройстве Android (тестировался в android 5.1 и 6.0). Я тестирую байтовый массив длиной 128, в android я получаю строку длиной 120, а в окнах я получаю строку длиной 125. Я предполагаю, что это имеет какое-то отношение к тому, что некоторые из байтов не являются действительными utf -8 символов, но по-прежнему странно, что я получаю разные результаты в зависимости от платформы. Если я изменю кодировку на US-ASCII, я получу тот же результат на обеих платформах, что и ожидалось: Редактировать: Извините за путаницу. Каждый раз я не генерирую его наугад. Я просто имею в виду, что байты не имеют значимого значения UTF-8. Это массив байтов, который я использую для тестирования: Изменить 2: Результат окон: Редактировать 3: Добавлены правильные строки UTF-16 Редактировать 4: Измененный код для рабочего примера Кажется, Android немного неаккуратно при интерпретации последовательностей UTF-8. Соответствующая часть стандарта находится в D92 в главе 3 «Соответствие» : До стандарта Unicode, версия 3.1, проблемные последовательности «не кратчайших форм» в UTF-8 были такими, где символы BMP могли быть представлены более чем одним способом. Эти последовательности плохо сформированы, потому что они не разрешены в таблице 3-7 . Ваш вход имеет такую ​​последовательность «не кратчайшей формы», например, -32, -121, -102 и -63, -69 . Хотя Android интерпретирует каждую из этих последовательностей в одном символе, Java корректно отвергает эти последовательности и преобразует каждый байт искаженного ввода в один символ замены, что приводит к более длинной строке. Вы можете продемонстрировать его на Java с помощью анализатора, который интерпретирует «Модифицированный UTF-8»: Который будет печатать Он также показывает правильные «кратчайшие формы» последовательностей символов. В выводах есть несколько отличий. Первый соответствует входной последовательности байтов 0xE0 0x87 0x9A. Правильное декодирование является символом (символами) исключения или замены. (Должен ли он быть одним, двумя или тремя заменяющими символами? Я бы утвердил два, это то, что дает декодер .NET на моей машине. Но в большинстве случаев я предпочитаю исключения в большинстве случаев.) Ваши JVM Andriod интерпретируют это как U + 01DA . Это, вероятно, «правильно» математически в алгоритме, который выполняет недостаточные проверки на недопустимые последовательности. Источник Преобразование строки в byte Array и обратный в Java Если вы посмотрите на способы преобразования между строкой и массивом карт в Java Автор: Chandra Prakash Дата записи Преобразование строки в byte Array и обратный в Java 1. Введение Нам часто нужно конвертировать между Струнные и byte массива в Java. В этом учебнике мы рассмотрим эти операции в деталях. Дальнейшее чтение: Java InputStream в Byte Array и ByteBuffer Java – Читатель в Byte Array Java Byte Array для вводапотока Во-первых, мы будем смотреть на различные способы преобразования Струнные к byte массив. Затем мы посмотрим на аналогичные операции в обратном направлении. 2. Преобразование строки в Byte Array Струнные хранится в качестве массива символов Unicode на Java. Чтобы преобразовать его в byte массив, мы переводим последовательность символов в последовательность байтов. Для этого перевода, мы используем пример Чарсет . Этот класс определяет отображение между последовательностью char s и последовательность byte s . Мы называем вышеупомянутый процесс кодирование . Мы можем закодировать Струнные в byte массива в Java несколькими способами. Рассмотрим каждый из них подробно с примерами. 2.1. Использование String.getBytes() Струнные класс обеспечивает три перегруженных getBytes методы кодирования Струнные в карт- массив : getBytes () – кодирует с помощью charset платформы по умолчанию getBytes (String charsetName) – кодирует с помощью имени charset getBytes (Charset charset) – коды с использованием предоставленного charset Во-первых, давайте закодируем строку с помощью charset платформы по умолчанию: Вышеупомянутый метод зависит от платформы, поскольку он использует charset платформы по умолчанию. Мы можем получить этот charset, позвонив Charset.defaultCharset () . Во-вторых, давайте закодируем строку с помощью имени charset: Этот метод бросает НеподдерживаемыйУкодированиеИсключаемость если названный charset не поддерживается. Поведение вышеуказанных двух версий не определено, если вход содержит символы, которые не поддерживаются charset. В отличие от этого, третья версия использует набор замены charset по умолчанию для кодирования неподдерживаемого ввода. Далее, назовем третью версию getBytes () метод и пройти экземпляр Чарсет: Здесь мы используем заводской метод Charset.forName чтобы получить экземпляр Чарсет . Этот метод делает исключение времени выполнения, если имя запрошенного charset является недействительным. Он также бросает исключение времени выполнения, если charset поддерживается в текущем JVM. Тем не менее, некоторые charsets гарантированно будут доступны на каждой платформе Java. СтандартныеЧарсеты класс определяет константы для этих charsets. Наконец, давайте закодируем с помощью одного из стандартных charsets: Таким образом, мы заверим обзор различных getBytes Версии. Далее рассмотрим метод, предоставленный Чарсет себя. 2.2. Использование Charset.encode() Чарсет класс обеспечивает кодировать () , удобный метод, который кодирует символы Unicode в байты. Этот метод всегда заменяет недействительные входные и неприменимые символы с помощью массива byte замены charset по умолчанию. Давайте использовать кодировать метод преобразования струна в байт массив: Как мы видим выше, неподдерживаемые символы были заменены заменой charset по умолчанию byte 63. Используемые до сих пор подходы используют ЧарсетЭнкодер класс внутренне для выполнения кодирования. Рассмотрим этот класс в следующем разделе. 2.3. ЧарсетЭнкодер ЧарсетЭнкодер преобразует символы Unicode в последовательность байтов для данного набора символов . Кроме того, он обеспечивает мелкозернистый контроль над процессом кодирования . Давайте использовать этот класс для преобразования Струнные в byte массив: Здесь мы создаем экземпляр ЧарсетЭнкодер позвонив в newEncoder метод на Чарсет объект. Затем мы уточняем действия для условий ошибки, вызывая onMalformedInput() и onUnmappableCharacter () методы . Мы можем указать следующие действия: IGNORE – падение ошибочного ввода REPLACE – заменить ошибочный вход РЕПОРТ – сообщите об ошибке, вернув КодерРесульт объект или бросание Кодирование символовИсключаемость Кроме того, мы используем заменитьС () метод определения замены byte массив. Таким образом, мы заверим обзор различных подходов к преобразованию строки в массив byte. Давайте далее рассмотрим обратную операцию. 3. Преобразование byte Array в строку Мы имеем в виду процесс преобразования byte массив к Струнные как декодирование . Как и кодирование, этот процесс требует Чарсет . Тем не менее, мы не можем просто использовать любой charset для расшифровки массива byte. Мы должны использовать charset, который был использован для кодирования Струнные в byte массив . Мы можем преобразовать массив byte в строку по-разному. Рассмотрим каждый из них в деталях. 3.1. Использование струнного конструктора Струнные класс имеет несколько конструкторов, которые принимают byte массив в качестве входного . Все они похожи на getBytes метод, но работать в обратном направлении. Во-первых, давайте преобразуем массив карт- Струнные использование charset платформы по умолчанию: Обратите внимание, что мы ничего не утверждаем здесь о содержании расшифрованной строки. Это происходит потому, что он может расшифровать что-то другое, в зависимости от набора символов платформы по умолчанию. По этой причине, мы должны, как правило, избегать этого метода. Во-вторых, давайте использовать именованный charset для декодирования: Этот метод делает исключение, если названный charset недоступен на JVM. В-третьих, Давайте использовать Чарсет объект для декодирования: Наконец, давайте использовать стандартный Чарсет для того же: До сих пор мы преобразовали byte массив в Струнные с помощью конструктора. Давайте теперь рассмотрим другие подходы. 3.2. Использование Charset.decode() Чарсет класс обеспечивает декодировать () метод преобразования ByteBuffer Струнные : Вот, недействительный вход заменяется символом замены по умолчанию для charset. 3.3. Чарсетдекодер Все предыдущие подходы к расшифровке внутренне используют Чарсетдекодер класса. Мы можем использовать этот класс непосредственно для мелкозернистого контроля процесса декодирования : Здесь мы заменяем недействительные входы и неподдерживаемые символы на “?”. Если мы хотим быть информированными в случае недействительных входов, мы можем изменить декодер как: 4. Заключение В этой статье мы исследовали несколько способов преобразования Струнные к массиву byte и обратному. Мы должны выбрать подходящий метод на основе входных данных, а также уровня контроля, необходимого для недействительных входных данных. Как обычно, полный исходный код можно найти более на GitHub . Источник
  8. Way 4: adding double quotes (“”) to byte value
  9. Way 5: Using append() method of StringBuffer & StringBuilder
  10. Auto-boxing of Byte wrapper-type to primitive byte data-type and vice-versa
  11. String from byte с UTF-8 дает разные результаты на Android, чем на Windows JVM
  12. Преобразование строки в byte Array и обратный в Java
  13. Преобразование строки в byte Array и обратный в Java
  14. 1. Введение
  15. Дальнейшее чтение:
  16. Java InputStream в Byte Array и ByteBuffer
  17. Java – Читатель в Byte Array
  18. Java Byte Array для вводапотока
  19. 2. Преобразование строки в Byte Array
  20. 2.1. Использование String.getBytes()
  21. 2.2. Использование Charset.encode()
  22. 2.3. ЧарсетЭнкодер
  23. 3. Преобразование byte Array в строку
  24. 3.1. Использование струнного конструктора
  25. 3.2. Использование Charset.decode()
  26. 3.3. Чарсетдекодер
  27. 4. Заключение
Читайте также:  Где лежит whatsapp андроид

2 примера для преобразования массива Byte [] в строку в Java

Преобразование байтового массива в String кажется простым, но трудно сделать это правильно. Многие программисты делают ошибку, игнорируя кодировку символов всякий раз, когда байты преобразуются в String или char или наоборот. Как программист, мы все знаем, что компьютер понимает только двоичные данные, то есть 0 и 1. Все, что мы видим и используем, например изображения, текстовые файлы, фильмы или любые другие мультимедийные файлы, хранится в виде байтов, но что более важно это процесс кодирования или декодирования байтов в символ. Преобразование данных является важной темой на любом собеседовании по программированию, и из-за хитрости кодирования символов эти вопросы являются одним из самых популярных вопросов о интервью в формате String в интервью Java. При чтении строки из входного источника, например, файлов XML, HTTP-запроса, сетевого порта или базы данных, вы должны обратить внимание на то, какую кодировку символов (например, UTF-8, UTF-16 и ISO 8859-1) они кодируют. Если вы не будете использовать ту же кодировку символов при преобразовании байтов в строку , вы получите поврежденную строку, которая может содержать совершенно неправильные значения. Вы могли видеть ?, квадратные скобки после преобразования byte [] в String, это из-за значений, которые ваша текущая кодировка символов не поддерживает, и просто показывает некоторые значения мусора.

Я пытался понять, почему программы делают ошибки кодирования символов чаще, чем нет, и мои небольшие исследования и собственный опыт позволяют предположить, что это может быть вызвано двумя причинами: во-первых, недостаточно для интернационализации и кодировки символов, а во-вторых, потому что символы ASCII поддерживаются почти все популярные схемы кодирования и имеют одинаковые значения. Поскольку мы в основном имеем дело с кодировкой, такой как UTF-8, Cp1252 и Windows-1252, которая отображает символы ASCII (в основном алфавиты и цифры) без сбоев, даже если вы используете другую схему кодирования. Настоящая проблема возникает, когда ваш текст содержит специальные символы, например «é» , который часто используется во французских именах. Если кодировка символов вашей платформы не распознает этот символ, то либо вы увидите другой символ, либо что-то в этом роде, и, к сожалению, пока вы не обожгете руки, вы вряд ли будете осторожны с кодировкой символов. В Java все немного сложнее, потому что многие классы ввода-вывода, например InputStreamReader, по умолчанию используют кодировку символов платформы. Это означает, что если вы запустите свою программу на другом компьютере, вы, скорее всего, получите другой вывод из-за разного кодирования символов, используемого на этом компьютере. В этой статье мы узнаем, как преобразовать byte [] в String в Java как с помощью JDK API, так и с помощью общих утилит Guava и Apache.

Как преобразовать byte [] в строку в Java

Есть несколько способов изменить байтовый массив на String в Java, вы можете использовать методы из JDK или использовать бесплатные API с открытым исходным кодом, такие как Apache commons и Google Guava. Этот API предоставляет как минимум два набора методов для создания байтового массива формы String; один, который использует кодировку платформы по умолчанию, а другой — кодировку символов. Вы всегда должны использовать позже, не полагайтесь на кодировку платформы. Я знаю, что это может быть то же самое, или вы, возможно, не сталкивались с какими-либо проблемами, но лучше быть в безопасности, чем потом сожалеть. Как я указывал в своем последнем посте о печати байтового массива в виде шестнадцатеричной строки , это также один из лучших способов указания кодировки символов при преобразовании байтов в символы на любом языке программирования. Возможно, ваш байтовый массив содержит непечатаемые символы ASCII. Давайте сначала посмотрим, как JDK преобразует byte [] в String:

  1. Вы можете использовать конструктор String, который принимает байтовый массив и кодировку символов:
Читайте также:  3dmark wildlife android рейтинг

Это правильный способ преобразования байтов в строку, если вы точно знаете, что байты кодируются в кодировке символов, которую вы используете.

Если вы читаете байтовый массив из любого текстового файла, например, XML-документа, HTML-файла или двоичного файла, вы можете использовать библиотеку Apache Commons IO для непосредственного преобразования FileInputStream в строку. Этот метод также буферизует входные данные для внутреннего использования, поэтому нет необходимости использовать другой BufferedInputStream .

Чтобы правильно преобразовать этот байтовый массив в строку, вы должны сначала обнаружить правильную кодировку символов, прочитав метаданные, например Content-Type, и т. Д., В зависимости от формата / протокола данных, которые вы читаете. , Это одна из причин, по которой я рекомендую использовать парсеры XML, например парсеры SAX или DOM, для чтения XML-файлов, они сами занимаются кодированием символов.

Некоторые программисты также рекомендуют использовать Charset over String для определения кодировки символов, например, вместо «UTF-8» используйте StandardCharsets.UTF_8, главным образом, чтобы избежать исключения UnsupportedEncodingException в худшем случае. Существует шесть стандартных реализаций Charset, которые гарантированно поддерживаются всеми реализациями платформы Java. Вы можете использовать их вместо указания схемы кодирования в String. Короче говоря, всегда предпочитайте StandardCharsets.ISO_8859_1 вместо «ISO_8859_1», как показано ниже:

Другие стандартные кодировки, поддерживаемые платформой Java:

  1. StandardCharsets.ISO_8859_1
  2. StandardCharsets.US_ASCII
  3. StandardCharsets.UTF_16
  4. StandardCharsets.UTF_16BE
  5. StandardCharsets.UTF_16LE

Если вы читаете байты из входного потока, вы также можете проверить мой предыдущий пост о 5 способах преобразования InputStream в String в Java для получения подробной информации.

Источник

Byte to String conversion in Java – 5 ways

In this article, we will discuss various ways to convert Byte to String in Java

Byte:

  • Size is 1 byte
  • Its range is -128 to 127

Various ways to convert Byte to String

  1. using Byte.toString(byteVal);
  2. using String.valueOf(byteVal);
  3. create Byte object and then convert to String using toString() method
  4. adding double quotes (“”) to byte value
  5. using append() method of StringBuffer or StringBuilder

Read String class in detail with example

Let us move forward and discuss all possible ways to convert Byte to String in Java

Way 1: Using Byte.toString(byteVal); method

  • This method can be used to convert primitive byte data-type or Byte wrapper-type to String object

Method signature:

ConvertByteToStringUsingToStringMethod.java

Output:

Way 2: Using String.valueOf(byteVal); method

  • This method can be used to convert primitive byte data-type or Byte wrapper-type to String object

Method signature:

ConvertByteToStringUsingValueOfMethod.java

Output:

Way 3: create Byte object and then convert to String using toString() method
  • Here, we will create new Byte object with primitive byte value as constructor-argument
  • After creating new Byte object by passing primitive byte value, then invoke toString() method for converting primitive byte data-type to String object

Method signature:

ConvertByteToStringUsingObjectCreation.java

Output:

Way 4: adding double quotes (“”) to byte value

  • Note: for this conversion to work, double-quotes (“”) must be added at the start of the concatenation

Syntax:

ConvertByteToStringByAddingDoubleQuotes.java

Output:

Way 5: Using append() method of StringBuffer & StringBuilder

  • This method can be used to convert primitive byte data-type to String object by appending to StringBuffer or StringBuilder object
  • And then invoking toString() method

Syntax:

ConvertByteToStringByAppending.java

Output:

Auto-boxing of Byte wrapper-type to primitive byte data-type and vice-versa

  • Auto-boxing feature available from Java 1.5 version
  • So, converting primitive data-type to wrapper-type can easily be done, by directly assigning
  • Let’s see one example based on this auto-boxing feature

AutoBoxingFeatureForByteConversion.java

Output:

Hope, you found this article very helpful. If you have any suggestion or want to contribute any other way or tricky situation you faced during Interview hours, then share with us. We will include that code here.

Источник

String from byte с UTF-8 дает разные результаты на Android, чем на Windows JVM

Я пытаюсь преобразовать массив байтов в строку в Java со следующим кодом:

Проблема в том, что я получаю другой результат, если я запускаю код в Windows (JVM 1.8.0_112), чем если бы я запускал его в своем устройстве Android (тестировался в android 5.1 и 6.0). Я тестирую байтовый массив длиной 128, в android я получаю строку длиной 120, а в окнах я получаю строку длиной 125. Я предполагаю, что это имеет какое-то отношение к тому, что некоторые из байтов не являются действительными utf -8 символов, но по-прежнему странно, что я получаю разные результаты в зависимости от платформы.

Если я изменю кодировку на US-ASCII, я получу тот же результат на обеих платформах, что и ожидалось:

Редактировать: Извините за путаницу. Каждый раз я не генерирую его наугад. Я просто имею в виду, что байты не имеют значимого значения UTF-8. Это массив байтов, который я использую для тестирования:

Изменить 2: Результат окон:

Редактировать 3: Добавлены правильные строки UTF-16

Редактировать 4: Измененный код для рабочего примера

Кажется, Android немного неаккуратно при интерпретации последовательностей UTF-8. Соответствующая часть стандарта находится в D92 в главе 3 «Соответствие» :

До стандарта Unicode, версия 3.1, проблемные последовательности «не кратчайших форм» в UTF-8 были такими, где символы BMP могли быть представлены более чем одним способом. Эти последовательности плохо сформированы, потому что они не разрешены в таблице 3-7 .

Ваш вход имеет такую ​​последовательность «не кратчайшей формы», например, -32, -121, -102 и -63, -69 . Хотя Android интерпретирует каждую из этих последовательностей в одном символе, Java корректно отвергает эти последовательности и преобразует каждый байт искаженного ввода в один символ замены, что приводит к более длинной строке.

Вы можете продемонстрировать его на Java с помощью анализатора, который интерпретирует «Модифицированный UTF-8»:

Который будет печатать

Он также показывает правильные «кратчайшие формы» последовательностей символов.

В выводах есть несколько отличий. Первый соответствует входной последовательности байтов 0xE0 0x87 0x9A. Правильное декодирование является символом (символами) исключения или замены. (Должен ли он быть одним, двумя или тремя заменяющими символами? Я бы утвердил два, это то, что дает декодер .NET на моей машине. Но в большинстве случаев я предпочитаю исключения в большинстве случаев.)

Ваши JVM Andriod интерпретируют это как U + 01DA . Это, вероятно, «правильно» математически в алгоритме, который выполняет недостаточные проверки на недопустимые последовательности.

Источник

Преобразование строки в byte Array и обратный в Java

Если вы посмотрите на способы преобразования между строкой и массивом карт в Java

Автор: Chandra Prakash
Дата записи

Преобразование строки в byte Array и обратный в Java

1. Введение

Нам часто нужно конвертировать между Струнные и byte массива в Java. В этом учебнике мы рассмотрим эти операции в деталях.

Дальнейшее чтение:

Java InputStream в Byte Array и ByteBuffer

Java – Читатель в Byte Array

Java Byte Array для вводапотока

Во-первых, мы будем смотреть на различные способы преобразования Струнные к byte массив. Затем мы посмотрим на аналогичные операции в обратном направлении.

2. Преобразование строки в Byte Array

Струнные хранится в качестве массива символов Unicode на Java. Чтобы преобразовать его в byte массив, мы переводим последовательность символов в последовательность байтов. Для этого перевода, мы используем пример Чарсет . Этот класс определяет отображение между последовательностью char s и последовательность byte s .

Мы называем вышеупомянутый процесс кодирование .

Мы можем закодировать Струнные в byte массива в Java несколькими способами. Рассмотрим каждый из них подробно с примерами.

2.1. Использование String.getBytes()

Струнные класс обеспечивает три перегруженных getBytes методы кодирования Струнные в карт- массив :

  • getBytes () – кодирует с помощью charset платформы по умолчанию
  • getBytes (String charsetName) – кодирует с помощью имени charset
  • getBytes (Charset charset) – коды с использованием предоставленного charset

Во-первых, давайте закодируем строку с помощью charset платформы по умолчанию:

Вышеупомянутый метод зависит от платформы, поскольку он использует charset платформы по умолчанию. Мы можем получить этот charset, позвонив Charset.defaultCharset () .

Во-вторых, давайте закодируем строку с помощью имени charset:

Этот метод бросает НеподдерживаемыйУкодированиеИсключаемость если названный charset не поддерживается.

Поведение вышеуказанных двух версий не определено, если вход содержит символы, которые не поддерживаются charset. В отличие от этого, третья версия использует набор замены charset по умолчанию для кодирования неподдерживаемого ввода.

Далее, назовем третью версию getBytes () метод и пройти экземпляр Чарсет:

Здесь мы используем заводской метод Charset.forName чтобы получить экземпляр Чарсет . Этот метод делает исключение времени выполнения, если имя запрошенного charset является недействительным. Он также бросает исключение времени выполнения, если charset поддерживается в текущем JVM.

Тем не менее, некоторые charsets гарантированно будут доступны на каждой платформе Java. СтандартныеЧарсеты класс определяет константы для этих charsets.

Наконец, давайте закодируем с помощью одного из стандартных charsets:

Таким образом, мы заверим обзор различных getBytes Версии. Далее рассмотрим метод, предоставленный Чарсет себя.

2.2. Использование Charset.encode()

Чарсет класс обеспечивает кодировать () , удобный метод, который кодирует символы Unicode в байты. Этот метод всегда заменяет недействительные входные и неприменимые символы с помощью массива byte замены charset по умолчанию.

Давайте использовать кодировать метод преобразования струна в байт массив:

Как мы видим выше, неподдерживаемые символы были заменены заменой charset по умолчанию byte 63.

Используемые до сих пор подходы используют ЧарсетЭнкодер класс внутренне для выполнения кодирования. Рассмотрим этот класс в следующем разделе.

2.3. ЧарсетЭнкодер

ЧарсетЭнкодер преобразует символы Unicode в последовательность байтов для данного набора символов . Кроме того, он обеспечивает мелкозернистый контроль над процессом кодирования .

Давайте использовать этот класс для преобразования Струнные в byte массив:

Здесь мы создаем экземпляр ЧарсетЭнкодер позвонив в newEncoder метод на Чарсет объект.

Затем мы уточняем действия для условий ошибки, вызывая onMalformedInput() и onUnmappableCharacter () методы . Мы можем указать следующие действия:

  • IGNORE – падение ошибочного ввода
  • REPLACE – заменить ошибочный вход
  • РЕПОРТ – сообщите об ошибке, вернув КодерРесульт объект или бросание Кодирование символовИсключаемость

Кроме того, мы используем заменитьС () метод определения замены byte массив.

Таким образом, мы заверим обзор различных подходов к преобразованию строки в массив byte. Давайте далее рассмотрим обратную операцию.

3. Преобразование byte Array в строку

Мы имеем в виду процесс преобразования byte массив к Струнные как декодирование . Как и кодирование, этот процесс требует Чарсет .

Тем не менее, мы не можем просто использовать любой charset для расшифровки массива byte. Мы должны использовать charset, который был использован для кодирования Струнные в byte массив .

Мы можем преобразовать массив byte в строку по-разному. Рассмотрим каждый из них в деталях.

3.1. Использование струнного конструктора

Струнные класс имеет несколько конструкторов, которые принимают byte массив в качестве входного . Все они похожи на getBytes метод, но работать в обратном направлении.

Во-первых, давайте преобразуем массив карт- Струнные использование charset платформы по умолчанию:

Обратите внимание, что мы ничего не утверждаем здесь о содержании расшифрованной строки. Это происходит потому, что он может расшифровать что-то другое, в зависимости от набора символов платформы по умолчанию.

По этой причине, мы должны, как правило, избегать этого метода.

Во-вторых, давайте использовать именованный charset для декодирования:

Этот метод делает исключение, если названный charset недоступен на JVM.

В-третьих, Давайте использовать Чарсет объект для декодирования:

Наконец, давайте использовать стандартный Чарсет для того же:

До сих пор мы преобразовали byte массив в Струнные с помощью конструктора. Давайте теперь рассмотрим другие подходы.

3.2. Использование Charset.decode()

Чарсет класс обеспечивает декодировать () метод преобразования ByteBuffer Струнные :

Вот, недействительный вход заменяется символом замены по умолчанию для charset.

3.3. Чарсетдекодер

Все предыдущие подходы к расшифровке внутренне используют Чарсетдекодер класса. Мы можем использовать этот класс непосредственно для мелкозернистого контроля процесса декодирования :

Здесь мы заменяем недействительные входы и неподдерживаемые символы на “?”.

Если мы хотим быть информированными в случае недействительных входов, мы можем изменить декодер как:

4. Заключение

В этой статье мы исследовали несколько способов преобразования Струнные к массиву byte и обратному. Мы должны выбрать подходящий метод на основе входных данных, а также уровня контроля, необходимого для недействительных входных данных.

Как обычно, полный исходный код можно найти более на GitHub .

Источник

Оцените статью