Java给了我与C中相同数据包的不同缓冲区

时间:2016-05-12 19:33:33

标签: java sockets networking buffer

Hello StackOverflow社区,

我一直在这个社区居住了一段时间,但我没有遇到任何其他在线解决方案的问题,或者至少,我无法找到它。

我使用Java创建客户端,一旦客户端连接到服务器,它就会收到一个包含合理和必要信息的数据包,当然它们是加密的;很久以前,我成功地在整个过程中反向设计了加密技术,并且在没有任何问题的情况下用C ++实现了加密,并且得到了充分的测试结果。

现在我试图用Java重写Java中的客户端以获得科学和更好的编码速度,但唯一的问题是数据包与它看起来不同。 例如,通过使用C本机应用程序嗅探数据包,我得到了一个缓冲区,但是我的Java客户端中的相同数据包会产生不同的结果。 我的意思是什么?我的意思是有几个0xFD / BF字节无效,导致缓冲区损坏,然后解密失败。

这些屏幕截图可让您更好地理解

原始正确数据包 Corrent packet

这是Java转储的数据包, CORRUPTED Incorrect packet

我使用Read作为套接字outStream的读取对象类。 你对这个问题的原因有什么看法吗?



private Reader _br = new InputStreamReader(socket.getInputStream());

char[] _data = new char[92];
this._br.read(_data);

_dump(toBytes(_data));




我只是把与此问题相关的代码。

1 个答案:

答案 0 :(得分:0)

您正在使用平台默认编码将随机字节(可能是您的密文)解码为字符,该编码似乎是UTF-8。

当然,这通常不起作用,所以更换角色,"�"或U + FFFD,在遇到无效字节序列的字符流中被替换。

然后打印字符,将(现已损坏的)文本编码为UTF-8。 U + FFFD的UTF-8编码是0xEF 0xBF 0xBD。

问题的原因是您将非文本数据视为文本。

更新

问题在于您正在创建InputStreamReader。不要这样做。仅当输入流包含编码文本时,这才有用。请将输入读入字节数组:

InputStream is = socket.getInputStream();
byte[] data = new byte[92];
for (int pos = 0; pos < data.length; ) {
  int n = is.read(data, pos, data.length - pos);
  if (n < 0)
    throw new EOFException();
  pos += n;
}
/* Print what you read for debugging... */
for (byte b : data)
  System.out.printf("%02X", b & 0xFF);
System.out.println();

现在data包含您的数据包。您可以解析它并解密密文。也许生成的纯文本实际上是文本,此时,您可以将其解码为字符。