2014-09-23 125 views
0

我试图创建一个16位值的数组通过网络顺序套接字发送。使用OutputStreamWriter写入二进制字符数组

首先,我已经定义一个数组来保存该值:

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

是否正在编写代理人的任何字符?你看过正在发送的实际数据吗? – 2014-09-23 22:57:02

+0

@DavidConrad数据可以是任何随机二进制值。 – Michael 2014-09-23 23:04:22

+0

@DavidConrad如果我明白你在说什么,如果任何值在代理范围(0xD800..0xDBFF/0xDC00..0xDFFF),那么一些翻译将会发生? – Michael 2014-09-23 23:08:16

回答

2

如果你想写字节,而不是字符,你应该使用原始OutputStream,而不是一个WriterOutputStream处理字节,Writer处理字符,字符集在它们之间转换。

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