我尝试创建一个16位值数组,以便按网络顺序通过套接字发送。
首先,我定义了一个数组来保存值:
char[] txbuf = new char[32]; // Java "char" is 16-bits
接下来,我打开套接字并创建OutputStreamWriter:
InetAddress serverAddr = InetAddress.getByName(host);
socket = new Socket(serverAddr, port);
writer = new OutputStreamWriter(socket.getOutputStream(),Charset.forName("UTF-16BE"));
然后我初始化要发送的数据:
txbuf[0] = 0x1234;
...
txbuf[31] = 0xFFFF;
最后,我将数据发送到套接字:
writer.write(txbuf,0,32);
write.flush();
但是,我发送数据的设备行为不规律,我怀疑UTF-16BE转换除了简单的网络顺序转换之外还实际上对数据做了什么(过滤字符?)存在一些问题。一切都在C中正常工作,但在Java端口中没有。
我已经看到了尝试编写原始二进制数据的各种复杂方案,但他们尝试的是最简单,最直接的方法。
上述方案有问题吗?
答案 0 :(得分:3)
如果要编写字节而不是字符,则应使用原始OutputStream
而不是Writer
。 OutputStream
处理字节,Writer
处理字符,字符集在它们之间转换。
DataOutputStream
以big-endian顺序将原始值写入OutputStream
,没有任何字节顺序标记或其他字符集问题。