【问题标题】:Convert hex to special characters (Java)将十六进制转换为特殊字符(Java)
【发布时间】:2012-07-08 11:52:08
【问题描述】:

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

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

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

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

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();

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

【问题讨论】:

  • 这是否准确:您需要将消息的长度作为前两个 8 位字符发送,但整个消息(包括长度)作为 ASCII 字符串发送?
  • 好的 - 你知道 Java 字符串是 16 字节的 Unicode,而不是 8 位的 ASCII,对吗?您可以读取和写入字符串,并在字符串和字节缓冲区之间进行转换,使用您希望的任何“编码”。例如:String myString = new String(myByteArray, "utf-8")。或byte[] myByteArray = myString.getBytes("utf-8")
  • @GregKopff 是的,这是正确的。但从我收到的示例请求消息来看,前两个字节由我在帖子中提到的特殊字符组成。

标签: java encoding hex ascii iso-8859-1


【解决方案1】:

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

 CharBuffer data = asciicharset .decode(inputBuffer);

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

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

【讨论】:

  • 我的错,我更正了我的评论。这正是我在输出缓冲区中看到 63 的地方。如果我在那里使用 UTF-8 而不是 ASCII,我仍然会得到相同的结果..即63
  • 当你说“如果我在那里使用 UTF-8 而不是 ASCII ......”你的意思是 both encode()decode() 行吗?
  • 是的,我只是将字符集中的 ASCII 替换为 UTF-8 asciicharset = Charset.forName("ASCII");
  • 但是使用其他方法,即类型转换为 char,我确实得到了正确的结果,但是当我将它与 ASCII 消息字符串的其余部分结合起来时,我再次在第二个字节中得到了不正确的值消息长度。
  • @highflyer (请回复您的 UTF-8 评论。)这可能是因为您尝试的值有 10... 的高两位,这在 UTF-8 中是非法的第一个字节,或者指定一个多字节字符,没有额外的有效 UTF-8 字节。 ISO-8859-1 字符集的工作方式是否不同?
猜你喜欢
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 2018-01-31
  • 2014-09-28
  • 1970-01-01
  • 2018-01-22
  • 2014-03-10
相关资源
最近更新 更多