Что это за "заголовок сокета" (байты, символы) до получения фактического xml от службы msxml?

Я использую java jaxb для демаршалирования xml- запроса через сокет, до фактического xml

<?xml version="1.0"....

Я получаю эти байты

00 00 01 F9 EF BB BF

Каковы они?, размер xml?, идентификатор сессии?...

Отправитель использует msxml4 выполнить запрос к моей службе.

Кроме того, я вижу, что отправитель ожидает этот тип заголовка (он усекает первые 7 байтов, если я отправляю непосредственно ответ xml).

Итак, когда я понял, что это за байты, есть ли "нормальный" какой-либо метод, использующий jaxb это может быть использовано для добавления этого заголовка или мне нужно сделать это вручную.

Спасибо за любой ответ

1 ответ

Решение

Это заголовок спецификации.

Первые 4 байта указывают размер файла 00 00 01 F9 = 0 + 0 + 256 + 249 = 505 (включая 3 байта, указывающих UTF-8 (EF BB BF). Следовательно, длина xml будет равна 502.

Как обработать этот поток с помощью Jaxb view:

Метка порядка байтов затрудняет чтение файлов в Java

почему org.apache.xerces.parsers.SAXParser не пропускает спецификацию в кодировке utf8 xml?

JAXB unmarshaller BOM handlele

Однако я предпочел обрабатывать поток за байтом, читая его в StringBuffer (так как он мне нужен также в строковом формате для регистрации)

Мое решение чтения байтов в байты реализовано так, чтобы ожидать символ '<', следовательно, первый символ в сообщении xml.

Чтобы добавить заголовок спецификации перед отправкой ответа, я использовал аналогичный метод:

import java.nio.ByteBuffer;
public byte[] getBOMMessage(int xmlLenght) {
    byte[] arr = new byte[7];
    ByteBuffer buf = ByteBuffer.wrap(arr);
    buf.putInt(xmlLenght+3);
    arr[4]=(byte)0xef;
    arr[5]=(byte)0xbb;
    arr[6]=(byte)0xbf;
    return arr;
}
Другие вопросы по тегам