2014-09-23 127 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,沒有任何字節順序標記或其他字符集問題。