Java 使用OutputStreamWriter写入二进制字符数组
我正在尝试创建一个16位值的数组,以便按网络顺序通过套接字发送 首先,我定义了一个数组来保存值:Java 使用OutputStreamWriter写入二进制字符数组,java,sockets,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 Output
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端口中却不行
我曾见过各种复杂的方案试图编写原始二进制数据,但我尝试的似乎是最简单、最直接的方法
上述方案有问题吗?如果要写入字节而不是字符,则应使用原始输出流
而不是写入器
OutputStream
处理字节,Writer
处理字符,字符集在它们之间进行转换
DataOutputStream
以大尾顺序将基本值写入OutputStream
,而不存在任何字节顺序标记或其他字符集问题。如果要写入字节而不是字符,则应使用原始OutputStream
而不是写入程序OutputStream
处理字节,Writer
处理字符,字符集在它们之间进行转换
DataOutputStream
以大尾顺序将基本值写入OutputStream
,而不存在任何字节顺序标记或其他字符集问题。如果要写入字节而不是字符,则应使用原始OutputStream
而不是写入程序OutputStream
处理字节,Writer
处理字符,字符集在它们之间进行转换
DataOutputStream
以大尾顺序将基本值写入OutputStream
,而不存在任何字节顺序标记或其他字符集问题。如果要写入字节而不是字符,则应使用原始OutputStream
而不是写入程序OutputStream
处理字节,Writer
处理字符,字符集在它们之间进行转换
DataOutputStream
以大尾顺序将基本值写入OutputStream
,而不存在任何字节顺序标记或其他字符集问题。您正在写入代理的字符中是否有任何字符?你看过正在发送的实际数据了吗?@DavidConrad数据可以是任何随机的二进制值。@DavidConrad如果我理解你的意思,如果任何值都在代理项范围内(0xD800..0xDBFF/0xDC00..0xDFFF),那么会发生一些转换吗?实际上,我不确定,但我认为这是值得研究的。这个设备真的理解UTF-16BE吗?如果不是,则应该写入字节,而不是字符。不要使用字符,就好像它们是线路上的16位。您正在编写的任何字符都是代理字符吗?你看过正在发送的实际数据了吗?@DavidConrad数据可以是任何随机的二进制值。@DavidConrad如果我理解你的意思,如果任何值都在代理项范围内(0xD800..0xDBFF/0xDC00..0xDFFF),那么会发生一些转换吗?实际上,我不确定,但我认为这是值得研究的。这个设备真的理解UTF-16BE吗?如果不是,则应该写入字节,而不是字符。不要使用字符,就好像它们是线路上的16位。您正在编写的任何字符都是代理字符吗?你看过正在发送的实际数据了吗?@DavidConrad数据可以是任何随机的二进制值。@DavidConrad如果我理解你的意思,如果任何值都在代理项范围内(0xD800..0xDBFF/0xDC00..0xDFFF),那么会发生一些转换吗?实际上,我不确定,但我认为这是值得研究的。这个设备真的理解UTF-16BE吗?如果不是,则应该写入字节,而不是字符。不要使用字符,就好像它们是线路上的16位。您正在编写的任何字符都是代理字符吗?你看过正在发送的实际数据了吗?@DavidConrad数据可以是任何随机的二进制值。@DavidConrad如果我理解你的意思,如果任何值都在代理项范围内(0xD800..0xDBFF/0xDC00..0xDFFF),那么会发生一些转换吗?实际上,我不确定,但我认为这是值得研究的。这个设备真的理解UTF-16BE吗?如果不是,则应该写入字节,而不是字符。不要像使用16位字符一样使用字符。