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
читать их.