java - 将十六进制转换为特殊字符 (Java)

标签 java encoding hex ascii iso-8859-1

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

计算了消息长度,结果是 752,即十六进制的 02F0。现在我需要计算出与该十六进制值对应的特殊符号。 为了获得我使用的那些

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

得到 -> ð 第一个字符在那里不可见(由于编码),但我确实得到了正确的字符。无论如何,但是当我将这些特殊字符连接到最终消息字符串(ASCII 格式)时,它会从 02F0 更改为 023f(通过在 ultraedit 十六进制 View 中读取最终消息来确认这一点)。为什么会发生这种情况? 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();

如有任何帮助,我们将不胜感激。 谢谢。

最佳答案

我怀疑您的问题不是发生在您评论的行上,而是发生在上一行上,即:

 CharBuffer data = asciicharset .decode(inputBuffer);

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

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

关于java - 将十六进制转换为特殊字符 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11389004/

相关文章:

postgresql - 如何使用 Struts 2 将数据插入 Postgres 数据库或从 Postgres 数据库检索数据?

java : ClassLoaders

windows - 这些以十六进制命名的文件夹是从哪里来的?

java - RegExp - 替换精确的字符串

python-2.7 - 统一码编码错误 : 'ascii' codec can't encode characters in position 321-322: ordinal not in range(128)

java - jsonrpc 响应中的西里尔字母符号

git - 红点标记 BitBucket 差异 View

string - 德尔福东京 - 功能 : String to Hex and Hex to String

java - java中的字节数组

Ubuntu 中的 JavaFX Scene Builder 路径