Nano Hash - криптовалюты, майнинг, программирование

Разница в длине байта при извлечении из сообщения WebSphere MQ

В Java я опрашиваю очередь сообщений WebSphere MQ, ожидая сообщения в формате `STRING, которое полностью состоит из XML. Часть этого XML будет содержать байты для вложения файла (любой формат: pdf, изображение и т. д.), который затем будет преобразован в большой двоичный объект для хранения в базе данных Oracle и последующего извлечения.

Проблема, с которой я сталкиваюсь, заключается в том, что известный размер отправляемых файлов примеров попадает в мою БД с другим размером. Я ничего не добавляю в байты (насколько я знаю), и размер кажется больше сразу после того, как я получаю сообщение. Я не могу определить, добавляю ли я каким-то образом информацию при извлечении, преобразовании из bytes -> String или это происходит во внешнем интерфейсе, когда отправитель заполняет сообщение.

Мой код при получении сообщения:

              inboundmsg = new MQMessage();
              inboundmsg = getMQMsg(FrontIncomingQueue, gmo);
              strLen = inboundmsg.getMessageLength();
              strData = new byte[strLen];
              ibm_id = inboundmsg.messageId;
              inboundmsg.readFully(strData);
              inboundmsgContents = new String(strData);

Я вижу файл, который, как известно, имеет размер 21 КБ, а затем 28 КБ. Коллега предположил, что проблема может быть в кодировке/кодировке. Я не указываю кодировку ни в вызове конструктора String выше, ни в любом из вызовов getBytes при обратном преобразовании из строки (для других несвязанных целей). Моя кодировка по умолчанию — ISO-8859-1. При разговоре с поставщиком, который инициирует передачу сообщения, я спросил ее, какую кодировку она использует. Ее ответ:

«Я использую метод File.WriteAllBytes в C# — я передаю ему путь к моему файлу, и он записывает его в байт []. Я не смог найти в MSDN никакой документации о том, какую кодировку использует функция. Метод создает массив байтов, и из того, что я прочитал в Интернете сегодня утром, нет кодировки, это просто последовательность 8-битных двоичных данных без знака без кодировки».

Другой коллега предположил, что, возможно, виновата кодировка MQ, но мое прочтение документации показывает, что кодировка MQ влияет только на поведение readString, readLine и writeString.

Если я полностью обхожу MQ и заполняю массив байтов, используя поток ввода файлов и локальный файл, размер файла сохраняется на всем пути к хранилищу Db, поэтому это определенно происходит во время или во время передачи сообщения.


  • Веднор сказал, какой API используется для отправки сообщения? Это клиент .net xms или классы .net? Интересно, есть ли в сообщении заголовок RFH2. Заголовок может быть большего размера, но 4k немного великоват. (JMS может читать RFH2). Вы просмотрели сообщение в очереди с помощью rfhutil или amqsbcg, чтобы увидеть, что там? Что именно находится в строке, которую вы получили? 26.09.2014
  • У меня есть электронное письмо поставщику с вопросом об API. Сразу после преобразования байтового массива StrData в строку в строке выше я записываю строку, содержащую содержимое сообщения. Это огромно, но вот резюме: 26.09.2014
  • ‹AttachmentSend xmlns:xsi=w3.org/2001/XMLSchema-instance xmlns:xsd =w3.org/2001/XMLSchema› ‹FormId›1‹/FormId› ‹FormType› SN‹/FormType› ‹FormName›DNSP‹/FormName› ‹ModifiedDate›09/25/2014 15:11:18‹/ModifiedDate› ‹Attachments› ‹AttachmentDetail› ‹Filename›lp.PNG‹/Filename› ‹AttachmentType›20 ‹/AttachmentType› ‹AttachmentDescription›Plants‹/AttachmentDescription› ‹PdfBytes›iVBORw0KGgoAAAANS … AAAAASUVORK5CYII=‹/PdfBytes› ‹/AttachmentDetail› ‹/Attachments› ‹/AttachmentSend› 26.09.2014
  • Извините, я понимаю, что комментарий выше не очень читаем. Короче говоря, строка, идущая между тегами PdfBytes, приводит к тому, что размер файла превышает размер исходного файла до передачи через MQ. Я поставил "...", чтобы обозначить очень большую строку. Это только кажется, что байтовая строка имеет другой размер; остальная часть сообщения в порядке и легко анализируется. Строка имеет неправильный размер перед синтаксическим анализом, я проверил. 26.09.2014

Ответы:


1

Проблема очевидна в формулировке вопроса. Вы описываете полезную нагрузку, содержащую произвольные двоичные данные, а также пытаетесь обработать ее как строку. Эти две вещи взаимоисключающие.

Это кажется сложным из-за того, что поставщик не предоставляет действительный XML. Например, рассмотрим вложение:

   <PdfBytes>iVBORw0KGgoAAAANS … AAAAASUVORK5CYII=</PdfBytes>

Если вложение на законных основаниях содержит какой-либо специальный символ XML, например < или >, результатом будет недопустимый XML. Если он содержит нулевые байты, некоторые синтаксические анализаторы предполагают, что они достигли конца текста, и прекращают синтаксический анализ там. Вот почему вы обычно видите, что любое вложение в XML либо преобразовано в Base64 для передачи, либо преобразовано в шестнадцатеричный формат.

Поставщик описывает запись необработанных двоичных данных, что предполагает, что то, что вы получаете, содержит нестроковые символы и, следовательно, не должно не отправляться как строковые данные. Если бы она описала какое-то преобразование, которое сделало бы вложение совместимым с XML, тогда строка была бы уместна.

Интересно, что при кодировании Base64 полезная нагрузка в 1,33 раза больше, чем исходная. Совпадение, что 21k * 1.3 = 28k? Можно подумать, что то, что получено, на самом деле является двоичной полезной нагрузкой в ​​формате Base64. Это на самом деле было бы разборчивым как строка и объясняет разницу в размерах файлов. Но это совсем не то, что описал продавец. она сказала, что пишет «8-битные двоичные данные без знака без кодировки», а не Base64.

Поэтому мы ожидаем, что он выйдет из строя, но не обязательно приведет к увеличению полезной нагрузки. Учтите, что WebSphere MQ, получив сообщение в формате String, попытается его преобразовать. Если CCSID сообщения отличается от запрошенного в GET, MQ попытается выполнить преобразование. Если входящий CCSID — UTF-16 или любой двухбайтовый набор символов, некоторые символы будут расширены с одного до двух байтов — при условии, что преобразование не приведет к недопустимым двоичным символам, вызывающим сбой.

Если два CCSID совпадают, то в классах MQ не предпринимается никаких попыток преобразования, но все еще остается проблема, заключающаяся в том, что что-то должно анализировать полезную нагрузку XML, которая по определению недействительна и, следовательно, может привести к неожиданным результатам. . Если случается так, что двоичная полезная нагрузка не содержит никаких специальных символов XML, а синтаксический анализатор не задыхается от каких-либо внедренных нулевых байтов, то синтаксический анализатор идет на довольно героические усилия, чтобы простить несоответствующую полезную нагрузку. Если он доберется до тега </PdfBytes> без задержек, он может предположить, что полезная нагрузка действительна, и сам преобразовать все, что находится между тегами <PdfBytes>...</PdfBytes>. Предположительно в Base64.

Все это предположения, конечно. Но в ситуации, когда полезная нагрузка однозначно не представляет собой строковые данные, любая попытка проанализировать ее как строковые данные либо полностью завершится неудачей, либо приведет к неожиданным и потенциально странным результатам. На самом деле вам не повезло, что это не выходит из строя сразу, потому что теперь есть ожидание, что проблема на вашей стороне, хотя очевидно, что это вина поставщика.

Предполагая, что содержимое полезной нагрузки остается неизменным, поставщик должен отправлять bytes сообщений, а вы должны получать их как bytes. Это, по крайней мере, устранило бы проблемы, с которыми MQ согласовывает ожидаемый формат с фактически полученным форматом, но это все равно будет недопустимым XML. Если работает то, что поставщик отправляет двоичные данные в сообщении, установленном для типа String, а вы обрабатываете его как bytes, тогда считайте свое благословение и используйте его таким образом, но не рассчитывайте на его надежность. В конце концов вы получите полезную нагрузку со встроенным специальным символом XML, и тогда у вас будет очень плохой день.

В идеале поставщик должен знать лучше, чем отправлять двоичные данные в полезной нагрузке XML без предварительного преобразования их в строку, и он должен исправить их, чтобы они соответствовали спецификации XML и были надежными.

См. эту страницу MSDN: XML, SOAP и двоичные данные

04.12.2014
  • Спасибо за информацию, Т. Роб. Проблема действительно привела к преобразованию base64. Поставщик теперь предоставляет строковое представление base64 необработанных байтов вложения, и после синтаксического анализа XML мое приложение вызывает DatatypeConverter.parseBase64Binary(b64string), чтобы вернуть необработанные байты для хранения в базе данных и последующего извлечения. 14.04.2015
  • Рад слышать, что это помогло! 14.04.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..