Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用OutputStreamWriter写入二进制字符数组_Java_Sockets - Fatal编程技术网

Java 使用OutputStreamWriter写入二进制字符数组

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

我正在尝试创建一个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端口中却不行

我曾见过各种复杂的方案试图编写原始二进制数据,但我尝试的似乎是最简单、最直接的方法

上述方案有问题吗?

如果要写入字节而不是字符,则应使用原始
输出流
而不是
写入器
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位字符一样使用字符。