2015-04-04 119 views
0

我正在寫一個簡單的客戶端 - 服務器應用程序,我希望能夠把一個頭類的屬性,使之成爲一個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)。

後的閱讀和修修補補小時,我無法得到它的權利,所以我試圖用字節緩衝區來代替。中提琴,正確的結果。

這是怎麼回事?我閱讀了這兩個文檔,雖然我發現了一些差異,但我沒有看到我的錯誤來源。

+0

線索的名稱是:** Byte **數組輸出流。 – 2015-04-04 22:21:11

+0

@ T.J.Crowder關於'write(int)的Javdoc中的線索。可以想象,'ByteArrayOutputStream'實現'DataOutput'例如。 – EJP 2015-04-04 22:33:20

回答

1

OutputStream.write(int)寫入單字節。查看Javadoc。如果你想寫更廣泛的價值,你將不得不使用的DataOutputStream,writeXXX()方法和DataInputStream相應readXXX()方法來閱讀。

+0

謝謝。甚至沒有看父類的方法。愚蠢的錯誤。 – dxh3707 2015-04-05 14:35:37