2012-07-09 41 views
0

我需要在前两个字节中发送消息的长度。将十六进制转换为特殊字符(Java)

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

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

让 - > d 第一个字符是不可见的存在(由于编码),但我得到正确的。无论如何,但是当我将这些特殊字符连接到最终消息字符串(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(); 

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

+0

这是否准确:您需要将消息的长度作为前两个8位字符发送,但是整个消息(包括长度)是作为ASCII字符串发送的吗? – 2012-07-09 04:19:36

+0

好的 - 你知道Java字符串是16字节的Unicode,而不是8位的ASCII,对吗?您可以读取和写入字符串,并在字符串和字节缓冲区之间进行转换,无论您希望使用哪种“编码”。例如:'String myString = new String(myByteArray,“utf-8”)'。或'byte [] myByteArray = myString.getBytes(“utf-8”)' – paulsm4 2012-07-09 04:22:42

+0

@GregKopff是的,这是正确的。但从我的示例请求消息中,前两个字节由我在文章中提到的特殊字符组成。 – highflyer 2012-07-09 04:24:26

回答

1

我怀疑你的问题没有发生在你发表意见的路线,而是以前线,即:

CharBuffer data = asciicharset .decode(inputBuffer); 

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

更新:从上面和下面的注释线程,现在我明白了更多关于您想要做的事情,我建议不要使用Charset(因为没有一个标准的命名编码可以用于任何/所有2个字节的组合,例如,对于长度来说,即使UTF-16有保留的值也是如此)。相反,我会建议只使用一个字节缓冲区,并且只在之后尝试将字符串转换为字符串,您已经从中删除了初始长度字节。

+0

我的不好,我纠正了我的评论。这正是我在outputbuffer中看到63的地方。如果我在这里使用UTF-8而不是ASCII,我仍然会得到相同的结果..i.e。 63 – highflyer 2012-07-09 04:37:59

+0

当你说“如果我在那里使用UTF-8而不是ASCII码......”,你是指* encode()和decode()这两行吗? – Turix 2012-07-09 04:40:01

+0

是的,我简单地用ASCII码替换UTF-8中的字符集asciicharset = Charset.forName(“ASCII”); – highflyer 2012-07-09 04:41:11

相关问题