0

我正在编写一个简单的客户端-服务器应用程序,我希望能够获取 Header 类的属性,将它们转换为 byte[],将它们发送到另一台主机,然后将它们转换回易于解析的 Header . 我正在使用 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。中提琴,正确的结果。

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

4

1 回答 1

1

OutputStream.write(int)写入单个字节。请参阅 Javadoc。如果要写入更宽的值,则必须使用 的writeXXX()方法DataOutputStream,和相应的readXXX()方法DataInputStream来读取它们。

于 2015-04-04T22:15:08.030 回答