使用OutputStreamWriter编写二进制char数组

时间:2014-09-23 22:51:21

标签: java sockets

我尝试创建一个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端口中没有。

我已经看到了尝试编写原始二进制数据的各种复杂方案,但他们尝试的是最简单,最直接的方法。

上述方案有问题吗?

1 个答案:

答案 0 :(得分:3)

如果要编写字节而不是字符,则应使用原始OutputStream而不是WriterOutputStream处理字节,Writer处理字符,字符集在它们之间转换。

DataOutputStream以big-endian顺序将原始值写入OutputStream,没有任何字节顺序标记或其他字符集问题。