想通过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的二进制该怎么处理?
既然是二进制,为什么不用byte类型呢
你这种写法是不对的,web发送数据时,写成byte发送,不会出现你的那种情况,到时候考虑高低位就行。
貌似数据大于0x80的都有这个问题,是不是二进制转化为字符的时候会有特殊处理?如果我真想要发送一个大于0x80的二进制该怎么处理?
这个问题和java语言底层实现有关,简单说就是java中-127--128中简单数都使用的是缓存实例,大于128的都重新生成实例。详见这篇博客:http://www.codeceo.com/article/why-java-1000-100.html
找到原因和解决方法了。
我之前用的是BufferedReader(字符缓冲输入流)发送的数据,二进制在发送前都要转化为字符再发送。
0x80以上的二进制转化为字符都会存在问题。
如果想要发送单纯的二进制流的话,用DataInputStream(数据输入流)这个就好了。