Массив байтов в строку с русскими символами
Есть изначально какая-то строка с русскими символами, к примеру:
String str = "тест";
Получаем массив байтов:
byte[] arr = str.getBytes()
Так вот, если посмотрим на получившийся массив, там будут вместо стандартных ASCII кодов отрицательные числа, т.к. байт от -128 до 127. И вопрос: как, имея эти отрицательные числа, получить ту же строку с русскими символами? Так как при переводе обычным String(arr) получаем из отрицательных неверные значения (�). Спасибо.
Java Best Practices – Преобразование символов в байты и байты в символы
Продолжая серию статей о предлагаемых практиках при работе с языком программирования Java, мы поговорим о настройке производительности String. Особенно мы сосредоточимся на том, как эффективно обрабатывать преобразования символов в байты и байты в символы при использовании кодировки по умолчанию. Эта статья завершается сравнением производительности между двумя предложенными пользовательскими подходами и двумя классическими (« String.getBytes () » и NIO ByteBuffer ) для преобразования символов в байты и наоборот.
Все обсуждаемые темы основаны на сценариях использования, полученных в результате разработки критически важных, высокопроизводительных производственных систем для телекоммуникационной отрасли.
Перед прочтением каждого раздела этой статьи настоятельно рекомендуется ознакомиться с соответствующей документацией по Java API для получения подробной информации и примеров кода.
Все тесты выполняются на Sony Vaio со следующими характеристиками:
- Система: openSUSE 11.1 (x86_64)
- Процессор (ЦП): Процессор Intel® Core ™ 2 Duo T6670 с частотой 2,20 ГГц
- Скорость процессора: 1200,00 МГц
- Общий объем памяти (ОЗУ): 2,8 ГБ
- Java: OpenJDK 1.6.0_0 64-битная
Применяется следующая тестовая конфигурация:
- Одновременный рабочий Темы: 1
- Тест повторений на одного работника Тема: 1000000
- Всего тестовых прогонов: 100
Преобразование символов в байты и байты в символы
Преобразование между байтами и байтами в символы считается распространенной задачей среди разработчиков Java, которые программируют в сетевой среде, манипулируют потоками байтовых данных, сериализуют объекты String , реализуют протоколы связи и т. Д. По этой причине Java предоставляет несколько утилит, которые позволяют Разработчик для преобразования String (или символьного массива) в его байтовый массив, эквивалентный и наоборот.
Операция « getBytes (charsetName) » класса String, вероятно, является наиболее часто используемым методом для преобразования строки в ее эквивалент байтового массива. Поскольку каждый символ может быть представлен по-разному в соответствии с используемой схемой кодирования, неудивительно, что вышеупомянутая операция требует « charsetName » для правильного преобразования символов String . Если « charsetName » не указано, операция кодирует строку в последовательность байтов, используя набор символов платформы по умолчанию.
Другой «классический» подход для преобразования символьного массива в эквивалент байтового массива — использование класса ByteBuffer пакета NIO. Пример фрагмента кода для конкретного подхода будет представлен позже.
Оба вышеупомянутые подходы, хотя очень популярны и неоспоримо проста в использовании и просто очень не хватает в производительности по сравнению с более мелкозернистый методами. Имейте в виду, что мы не конвертируем кодировки символов . Для преобразования между кодировками символов вы должны придерживаться «классических» подходов, используя либо « String.getBytes (charsetName) », либо методы и утилиты инфраструктуры NIO .
Когда все символы для преобразования являются символами ASCII, предложенный метод преобразования показан ниже:
Символы и байты – особенности конвертации в Java
В данной статье будет рассказано о том, как преобразовывать символы в байтовую форму. За основу взят язык программирования Java. Он пользуется спросом у большинства современных разработчиков.
Из курса информатики
Перед тем, как работать с программным кодом, strings и байтами, необходимо разобраться с базовыми знаниями. А именно – с представлением данных и единицами измерений. Эти сведения изучаются еще в школах на уроках информации.
Стоит запомнить следующее:
- Самая мелкая единица измерения – это бит.
- Бит – количество данных, необходимых для однозначного определения одного из двух равновероятных событий.
- Байт – последовательности длиной 8 битов. Они приняты в информатике.
- Килобайт – 1024 байта.
- Мегабайт – один из самых известных вариантов измерения. Равен 1024 килобайта.
- Гигабайт – 1024 МБ.
- Терабайт – это 1024 гигабайта.
- В 1 бит можно записать один двоичный символ.
В ASCII в один байт записывается один 256-символьный код, а в UNICODE на него требуется 2 байта.
Информационный объем
Иногда требуется работать не со string или конкретными фразами, а просто вычислить информационный объем сообщения. Для этого потребуется количество символов умножить на биты, необходимые для хранения одного элемента.
Пробелы тоже считаются за символы. Чтобы преобразовать текст в байтовую форму, потребуется сначала представить его в двоичной кодировке. Далее – произвести необходимые расчеты. Здесь – наглядные примеры реализации соответствующей задачи.
В Java
Теперь можно приступить к работе с Java. Рассматриваемая тема тесно связана с производительностью String. Приведенные примеры помогут при разработке эффективных систем для задач в сфере телекоммуникаций.
Для того, чтобы лучше понимать производительность string и Java, рекомендуется сначала изучать Java API. После этого преобразования будут усваиваться лучше. Работа осуществляется с char и byte.
Метод GetBytes
Рассматривая производительность string и пытаясь перевести текст (слово) в bytes, нужно понимать – у Java есть для этого специализированные инструменты. Они помогают программисту to обрабатывать байтовые последовательности и сериализовать strings, а также реализовывать всевозможные протоколы.
Первый вариант – это использование метода getBytes. Он предусматривает следующие особенности:
- Относится to class String.
- Является одним из самых распространенных для преобразования String методов.
- Обладает формой getBytes(charsetName). CharsetName ссылается to кодировку String.
- Если кодировки to string нет, метод переводит string to bytes самостоятельно. В процессе используется кодировка, установленная в операционной системе «по умолчанию».
Это – один из лучших методов, которые помогают перевести информацию в желаемую форму. Он не приводит к конвертации непосредственной кодировки символов.
Пакет NIO
Перевести text to bytes в Джаве можно иначе. Пример – использование класса ByteBuffer. Он находится в пакете под названием NIO. Относится к классическим методам конвертации информации.
Примеры
Теперь можно рассмотреть наглядные примеры реализации поставленной задачи. В случае с ASCII получится такой код:
- Происходит создание to массив b через кастинг каждого символьного значения в байтовый эквивалент. Во внимание принимается диапазон ASCII (0-127). Каждый элемент занимает to 1 byte.
- Обратное преобразование множества информации в массиве b можно провести через конструктор new String(byte[]): .
- Для кодировки по умолчанию можно воспользоваться такой записью: .
- Каждый char будет занимать to 2 bytes. Чтобы преобразовать строчки в байтовый вид, потребуется все его элементы (буквы и символьные записи) перевести в двухбайтовый вид. А затем – обратно в str: .
- Каждый char восстанавливается из двухбайтового аналога, после чего через конструктор string(char[]) создает новый объект.
Звучит сложно, но на практике такое конвертирование знаков не слишком трудное. А вот пример возможностей NIO для решения поставленной изначально задачи:
Для конвертируемого текста можно выбрать любой из предложенных подходов. Чтобы не ошибиться, соответствующие варианты рекомендуется сравнить. Для этого используют графики.
Несколько слов о производительности
Вот – результаты проведенных тестов производительности для каждого рассмотренного метода. Сначала – работа со строчками и переводы to bytes:
И отображение обратной операции:
Абсциссы – это количество тестов, ординаты – операции в секунду для каждой «проверки». То, что находится выше, обладает большей скоростью. «Классические» методы отработали хуже. Это нормальное явление. Задействованные реализации увеличили производительность почти на 30%.
Отсюда следует вывод – для того, чтобы перевести текст в байтовый вид быстро, можно использовать самописные методы. Они приводят к увеличению скорости обработки информации на 40-45%.
Для чайников
Задумываясь над тем, как символы текста перевести в байты, можно прийти к выводу, что не все готовы программировать или производить самостоятельные подсчеты. Но выход из ситуации есть. А именно – специализированные приложения. Они называются «конвертерами».
Обычно представлены онлайн страницами. Пользователь должен:
- Написать в окне желаемый текст.
- Выбрать параметры преобразования.
- Подтвердить операцию.
Это – самый быстрый и надежный вариант для тех, кто далек от информационных технологий. Здесь возможны обратные преобразования.
А вот – еще один онлайн-конвертер. Он более совершенный. Здесь можно выставлять учет регистра, а также исключения некоторых символов.
Как преобразовать массив байтов в hex-строку в Java
Часто в программировании на Java возникает необходимость преобразовать массив байтов в hex-строку. Например, когда работают с шифрованием, хэш-функциями или сетевым кодом. В этих ситуациях байты часто представляются в формате hex-строки.
Примером может быть массив байтов, представляющий цвет в формате RGB: . В данном случае, каждый байт представляет значение одного из цветов RGB. Для удобства чтения и использования этих значений их часто преобразуют в hex-строку.
Существует несколько способов преобразования массива байтов в hex-строку в Java.
Использование StringBuilder и String.format
Одним из подходов является использование StringBuilder и String.format . В первую очередь, создается экземпляр StringBuilder , который будет использоваться для накопления результата. Затем, каждый байт из массива преобразуется в двухсимвольную hex-строку с помощью String.format и добавляется в StringBuilder .
public String bytesToHex(byte[] bytes) < StringBuilder sb = new StringBuilder(); for (byte b : bytes) < sb.append(String.format("%02x", b)); >return sb.toString(); >
Использование класса BigInteger
Альтернативным подходом является использование класса BigInteger , который предоставляет возможность преобразования массива байтов в hex-строку с помощью метода toString . Стоит отметить, что этот метод может преобразовывать только положительные числа, поэтому перед его использованием важно убедиться, что все байты положительны.
public String bytesToHex(byte[] bytes)
В заключении стоит отметить, что правильный выбор подхода зависит от конкретной ситуации и требований. Каждый из приведенных методов имеет свои преимущества и недостатки, поэтому важно учитывать их при выборе подхода для преобразования массива байтов в hex-строку.
