我需要在前两个字节中发送消息的长度。
计算出消息长度,结果是752,即02F0为十六进制。现在我需要计算与此十六进制值对应的特殊符号。 为了得到我使用的那些
int num1 = Integer.parseInt("F0", 16);
char c1 = (char) num1;
获取 - > d 第一个字符在那里是不可见的(由于编码),但我确实得到了正确的字符。无论如何,当我将这些特殊字符连接到最终的消息字符串(用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();
任何帮助将不胜感激。 感谢。
答案 0 :(得分:1)
我怀疑您的问题不是在您评论的行上发生的,而是之前的行,即:
CharBuffer data = asciicharset .decode(inputBuffer);
ASCII字符是7位,而不是8位。因此任何大于127(十六进制为0x7F)的值都不会出现在asciicharset中,因此decode()
可能使用默认替换。 (注意63对应于字符'?',这是默认替换。)
更新:从上面和下面的评论主题,现在我对你要做的事情有了更多了解,我建议不要使用Charset(因为没有标准的命名编码可以用于您可能拥有的长度为2个字节的任何/所有组合,甚至UTF-16也有保留值(例如)。相反,我建议只使用一个字节缓冲区,并尝试在之后转换为字符串,从中剥离了初始长度字节。