将 UCS-2 HEX 转换为 UTF16 BE java

Convert UCS-2 HEX в UTF16 BE java

我有一个字符串,其中从 GSM 调制解调器接收到的 SMS 文本以 USC2 格式加密 我正在尝试将其转换为 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/工作正常

    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 字符大小相同(2 个字节)。 UTF-16 is superior to UCS-2 构成 fixed-size 子集。所以从UCS-2到UTF-16不需要特殊处理,只需要一个char的2个字节是big endian还是little endian。

尝试以下操作:

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

对于 JDK17 或更高版本,您还可以使用 HexFormat class:

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