0

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

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

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

获取 -> ð 第一个字符在那里不可见(由于编码),但我确实得到了正确的字符。无论如何,但是当我将这些特殊字符连接到最终消息字符串(以 ASCII 格式)时,它会从 02F0 变为 023f(通过在 ultraedit hex 视图中读取最终消息来确认)。为什么会这样?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();

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

4

1 回答 1

1

我怀疑您的问题没有发生在您评论的那一行,而是一行,即:

 CharBuffer data = asciicharset .decode(inputBuffer);

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

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

于 2012-07-09T04:31:22.063 回答