Как преобразовать UCS-2 HEX в UTF16 BE java

у меня имеется строка в которой зашифрован текст смс зашифрованный в формате USC2 полученный с GSM модема

Я пытаюсь его перекодировать в UTF16 но ничего не выходит. Подскажите пожалуйста что я делаю не так

import java.nio.charset.StandardCharsets;

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

        byte[] b = msg.getBytes(StandardCharsets.UTF_16BE);
        System.out.println(b);
    }
}

Компилятор

[B@4b67cf4d

Process finished with exit code 0

На онлайн декодере через сервис https://dencode.com/ выдает следующее введите сюда описание изображения


Ответы (1 шт):

Автор решения: ЮрийСПб

На котлине это можно так сделать:

fun String.decodeHex(): ByteArray {
    check(length % 2 == 0) { "Must have an even length" }

    return chunked(2)
        .map { it.toInt(16).toByte() }
        .toByteArray()
}

fun main() {
   val test = "0412044B0020043F043E043B044C043704430435044204350441044C002004420430044004380444043D044B043C0020043F043B0430043D043E043C0020002204110438002B002200200441002000300033002E00310032002E0032003000320031002E002004230442043E0447043D04380442044C002004430441043B043E04320438044F"
    
    val bytes = test.decodeHex()
    val bytesDecoded = String(bytes, Charsets.UTF_16BE)
    println("bytesDecoded: $bytesDecoded")
    //выведет
    //bytesDecoded: Вы пользуетесь тарифным планом "Би+" с 03.12.2021. Уточнить условия
}

Проверить можно тут: https://play.kotlinlang.org/


На Java переводить лень, алгоритм такой:

  1. Преобразуем строку в список строк, деля изначальную строку на части по 2 символа
  2. Полученный список строк преобразуем список Byte, применяя Integer.parseInt(stringToConvert, 2), после чего полученное Integer преобзазуем в Byte
  3. Полученный список Byte приобразуем в массив Byte
  4. Конвертим массив Byte в строку в кодировке UTF_16BE
→ Ссылка