我需要在前两个字节中发送消息的长度。将十六进制转换为特殊字符(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();
任何帮助,将不胜感激。 谢谢。
这是否准确:您需要将消息的长度作为前两个8位字符发送,但是整个消息(包括长度)是作为ASCII字符串发送的吗? – 2012-07-09 04:19:36
好的 - 你知道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
@GregKopff是的,这是正确的。但从我的示例请求消息中,前两个字节由我在文章中提到的特殊字符组成。 – highflyer 2012-07-09 04:24:26