Что это за "заголовок сокета" (байты, символы) до получения фактического 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;
}