有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

编码将十六进制转换为特殊字符(Java)

我需要发送前两个字节的消息长度

计算了消息长度,结果是752,比如说02F0,十六进制。现在我需要计算与这个十六进制值对应的特殊符号。 为了得到我用的东西

 int num1 = Integer.parseInt("F0", 16);
 char c1 = (char) num1;

获得->;ð 第一个字符在那里不可见(由于编码),但我得到了正确的字符。无论如何,但当我将这些特殊字符连接到最终消息字符串(ASCII)时,它将从02F0更改为023f(通过在ultraedit十六进制视图中读取最终消息确认)。为什么会这样?3F是十进制的63,我看到下面的代码片段也发生了同样的事情->

Charset asciicharset = Charset.forName("ASCII");
Charset iso88591charset = Charset.forName("ISO-8859-1");

byte [] a = new byte[]{(byte)0x02, (byte)0xF0};

ByteBuffer inputBuffer = ByteBuffer.wrap(a);

CharBuffer data = asciicharset .decode(inputBuffer);

ByteBuffer outputBuffer = asciicharset .encode(data); --> This is where instead of 240
for F0 I get 63, in fact I tried with any value more than 63 but it always comes back to
that

byte[] outputData = outputBuffer.array();

任何帮助都将不胜感激。 谢谢


共 (1) 个答案

  1. # 1 楼答案

    我怀疑你的问题不是发生在你评论的那一行,而是之前的那一行,即:

     CharBuffer data = asciicharset .decode(inputBuffer);
    

    ASCII字符是7位,而不是8位。因此,任何大于127(十六进制中的0x7F)的值都不会出现在您的asciicharset中,因此decode()可能正在使用默认替换。(请注意,63与字符“?”相对应,可以作为默认替换。)

    更新:从上面和下面的评论线程中,现在我对您试图做的事情有了更多的了解,我建议根本不要使用字符集(因为那里的标准命名编码都不适用于您可能拥有的长度为2字节的任何/所有组合,例如UTF-16也有保留值)。相反,我建议只使用字节缓冲区,并在从中剥离初始长度字节后,仅尝试转换为字符串