ByteArrayOutputStream: странное поведение

Я пишу простое клиент-серверное приложение, и я хотел иметь возможность взять атрибуты класса 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. Виола, верные результаты.

Что здесь происходит? Я прочитал документацию для обоих, и хотя я заметил некоторые различия, я не вижу, в чем причина моей ошибки.

1 ответ

OutputStream.write(int) пишет один байт. Смотрите Javadoc. Если вы хотите записать более широкие значения, вам придется использовать writeXXX() методы DataOutputStream, и соответствующий readXXX() методы DataInputStream читать их.

Другие вопросы по тегам