Специальные символы в строке Java

Я ищу решение для вставки специальных 1-байтовых символов в строку java, например 0xFE, 0xFF ( > 127).

Мне нужно использовать String вместо байтового массива, потому что методу класса нужен только тип String.

Что мне нужно в String = {0x07 0xAA 0x03 FF}. Да, это специальные символы, которые используются для управления устройством.

И я попытался использовать String constructur как:

byte[] arr = {0x07, (byte) 0xAA, 0x03, (byte) FF};
String s = new String(arr, "UTF-8"); 

// utf-8 использует для 1-байтовых символов, я также пробовал ascII, но результат был тот же

Все работает до значения 127 (dec) char в массиве, но после этого дает странный результат, например, 1 или 2 дополнительных байта в String, конечно, это произошло из-за того, что тип байта имеет максимальное значение 127. Но как исправить эту ситуацию ?? Нужна помощь.

Как я понял, я не могу добавить char [] в конструктор String

«Как я понял, я не могу добавить char [] в конструктор String» Что вы имеете в виду?

Andy Turner 04.09.2018 10:55

У String действительно есть конструктор, который принимает массив char. Это то, что вы искали?

TiiJ7 04.09.2018 11:06

Используйте escape-символы Unicode: String s = "\u0007\u00AA\u0003\u00FF";

Kevin Anderson 04.09.2018 11:06

Да, я имел в виду, что откуда мне знать, что тип char занимает 2 байта, верно? Итак, char 0xFF будет добавлен к строке, например 0x00 0xFF, .. но мне нужен 1 байт

Kost 04.09.2018 11:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
115
1

Ответы 1

Одна часть вашего вопроса неверна. UTF-8 хранит только печатаемые символы ASCII в диапазоне [32,126] как отдельные байты (кроме этого - 2 или даже 3 байта на символ), даже если кодировки обычно имеют длину 256 байтов. Поскольку в Java все строки автоматически сохраняются и печатаются как UTF-8 по умолчанию, они будут оставаться более 1 байта при печати.

Что вам нужно, так это кодировка, которая сохраняет все первые байты [1,256] как отдельные байты при доступе к байтам. Например, с вашим текущим кодом:

byte[] arr = {0x07, (byte) 0xAA, 0x03, (byte) 0xFF};
String s = new String(arr, "UTF-8");

System.out.println(s.getBytes().length); // This prints 8
System.out.println(s.getBytes("UTF-8").length); // This prints 8 as well (since the default is UTF-8)
System.out.println(s.getBytes("Windows-1252").length); // This prints 4

Попробуйте онлайн.

ISO-8859-1 (также известный как Кодовая страница 1252 или Windows-1252) или Кодовая страница 437 - две довольно известные кодировки.

Хорошо, с вашей помощью я нашел решение! Проблема в charSet !!! нужен ISO-8859-1

Kost 04.09.2018 11:38

char [] arr = {0x07, 0xAA, 0x03, 0xFF}; spt.writeString (новая строка (arr), «ISO-8859-1»); результат от portMonitor IRP_MJ_WRITE Serial0 SUCCESS Длина 4: 07 AA 03 FF

Kost 04.09.2018 11:40

@ Кост Рад, что смог помочь. :)

Kevin Cruijssen 04.09.2018 11:43

Другие вопросы по теме