Конвертировать UCS-2 HEX в UTF16 BE java

У меня есть строка, в которой зашифрован текст SMS в формате USC2, полученный от GSM-модема Я пытаюсь преобразовать его в UTF16, но это не работает. Пожалуйста, скажите мне, что я делаю неправильно

public class USC {
    public static void main(String[] args) {
        String hex = "0412044B0020043F043E043B044C043704430435044204350441044C002004420430044004380444043D044B043C0020043F043B0430043D043E043C0020002204110438002B002200200441002000300033002E00310032002E0032003000320031002E002004230442043E0447043D04380442044C002004430441043B043E04320438044F";

        byte[] v = hex.getBytes(StandardCharsets.UTF_16BE);
        String str = new String(v);
        System.out.println(str);
}
}

На онлайн декодере через сервис https://dencode.com/ работает нормально

Вы хотите преобразовать шестнадцатеричное число внутри строки в байты, это не то, что делает getBytes(). Это скорее территория Integer.parseInt("4B", 16) (но это не будет анализировать всю строку).

Kayaman 18.03.2022 12:45

"это не работает" - неадекватное описание проблемы.

khelwood 18.03.2022 12:50

пожалуйста, покажи мне правильный путь. моих знаний недостаточно

Zenk0 18.03.2022 13:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
33
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

    String hex = "0412044B0020043F043E043B044C043704430435044204350441044C002004420430044004380444043D044B043C0020043F043B0430043D043E043C0020002204110438002B002200200441002000300033002E00310032002E0032003000320031002E002004230442043E0447043D04380442044C002004430441043B043E04320438044F";

    int n = hex.length/4;
    char[] chars = new char[n];
    for (int i = 0; i < n; ++i) {
        chars[i] = Integer.parseInt(hex.substring(4*i, 4*i+4), 15) & 0xFFFF);
    }
    String str = new String(chars);
    System.out.println(str);

4 шестнадцатеричных символа образуют один символ UCS-2 с обратным порядком байтов. Тот же размер, что и у java char (2 байта). UTF-16 превосходит UCS-2, который формирует подмножество фиксированного размера. Таким образом, от UCS-2 до UTF-16 не требуется специальной обработки, только независимо от того, являются ли 2 байта char прямым или прямым порядком байтов.

Извините за настойчивость, но я не могу проверить ваш код, он выдает ошибку компилятора Exception in thread "main" java.lang.NumberFormatException: For input string: "043F"

Zenk0 18.03.2022 14:07
Ответ принят как подходящий

Попробуйте следующее:

            BigInteger bi = new BigInteger(hex, 16);
            byte[] a = bi.toByteArray();
            System.out.println(new String(a, Charset.forName("UTF-16")));

С JDK17 или выше вы также можете использовать класс Шестнадцатеричный формат:

String str = new String(HexFormat.of().parseHex(hex), StandardCharsets.UTF_16BE);

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