ByteArrayOutputStream:奇怪的行为

时间:2015-04-04 22:08:11

标签: java bytebuffer bytearrayoutputstream

我正在编写一个简单的客户端 - 服务器应用程序,我希望能够获取Header类的属性,将它们转换为byte [],将它们发送到另一个主机,然后将它们转换回一个轻松解析标题。我使用ByteArrayOutputStream来做到这一点,但结果不是我的预期。例如,只是为了在main()中测试它,我有:

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;
}

Header(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)。

经过几个小时的阅读和修补后,我无法做到正确,所以我尝试使用ByteBuffer。中提琴,正确的结果。

这里发生了什么?我阅读了两者的文档,虽然我发现了一些差异,但我没有看到我的错误来源是什么。

1 个答案:

答案 0 :(得分:1)

OutputStream.write(int)写一个单字节。请参阅Javadoc。如果您想要编写更宽的值,则必须使用writeXXX()的{​​{1}}方法和DataOutputStream,的相应readXXX()方法来阅读它们。