我正在寫一個簡單的客戶端 - 服務器應用程序,我希望能夠把一個頭類的屬性,使之成爲一個byte [],將它們發送到另一臺主機,然後轉換他們回到一個容易解析的標題。我使用ByteArrayOutputStream來做到這一點,但結果並不是我所期望的。例如,僅僅在主測試()我有:ByteArrayOutputStream:奇數行爲
Header h = Header();
h.setSource(111);
h.setDest(222);
h.setSeq(333);
h.setAck(444);
byte[] header = Header.convertHeaderToByteArray();
Header newHeader = new Header(headerArray);
凡convertHeaderToByteArray()看起來像:
public byte[] convertHeaderToByteArray() {
byte[] headerArray;
ByteArrayOutputStream byteStream = new ByteArrayOutputStream(44);
byteStream.write(srcPort);
byteStream.write(dstPort);
byteStream.write(seqNum);
byteStream.write(ackNum);
byteStream.write(controlBits);
headerArray = byteStream.toByteArray();
return headerArray;
}
和標題(headerArray)構造函數:
public Header(byte[] headerArray) {
ByteArrayInputStream header = new ByteArrayInputStream(headerArray);
srcPort = header.read();
dstPort = header.read();
seqNum = header.read();
ackNum = header.read();
}
這絕對不像預期的那樣。當我在最後看到這些值時,srcPort正確(111),dstPort正確(222),seqNum不正確(77),並且ackNum不正確(188)。
後的閱讀和修修補補小時,我無法得到它的權利,所以我試圖用字節緩衝區來代替。中提琴,正確的結果。
這是怎麼回事?我閱讀了這兩個文檔,雖然我發現了一些差異,但我沒有看到我的錯誤來源。
線索的名稱是:** Byte **數組輸出流。 – 2015-04-04 22:21:11
@ T.J.Crowder關於'write(int)的Javdoc中的線索。可以想象,'ByteArrayOutputStream'實現'DataOutput'例如。 – EJP 2015-04-04 22:33:20