java socket 发送二进制流的问题

想通过java socket发送一个二进制流:
0x05 0x03 0x00 0x00 0x00 0x40 0x45 0xbe
说明:这个二进制不代表任何字符串,就是一个命令,服务器端能够识别。

做法是这样的,先申请一块空间赋值,然后发送出去。
char cmd[] = {0x05, 0x03, 0x00, 0x00, 0x00, 0x40, 0x45, 0xbe};
os.print(cmd);
os.flush

或者:
char cmd[] = {0x05, 0x03, 0x00, 0x00, 0x00, 0x40, 0x45, 0xbe};
String command = new String(cmd);
os.print(command);
os.flush

用wireshark抓包看的话,
实际发送的数据是:
0x05, 0x03, 0x00, 0x00, 0x00, 0x40, 0x45, 0x3f.

这个是怎么回事儿?有大神知道吗?
我试了下,貌似数据大于0x80的都有这个问题,是不是二进制转化为字符的时候会有特殊处理?如果我真想要发送一个大于0x80的二进制该怎么处理?

4个回答

既然是二进制,为什么不用byte类型呢

qufudashaozi
qufudashaozi byte类型也试过,和char是一样的效果。
3 年多之前 回复

你这种写法是不对的,web发送数据时,写成byte发送,不会出现你的那种情况,到时候考虑高低位就行。

貌似数据大于0x80的都有这个问题,是不是二进制转化为字符的时候会有特殊处理?如果我真想要发送一个大于0x80的二进制该怎么处理?

这个问题和java语言底层实现有关,简单说就是java中-127--128中简单数都使用的是缓存实例,大于128的都重新生成实例。详见这篇博客:http://www.codeceo.com/article/why-java-1000-100.html

找到原因和解决方法了。
我之前用的是BufferedReader(字符缓冲输入流)发送的数据,二进制在发送前都要转化为字符再发送。
0x80以上的二进制转化为字符都会存在问题。

如果想要发送单纯的二进制流的话,用DataInputStream(数据输入流)这个就好了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐