Является ли порядковый номер кода asn.1 независимым?

У меня есть два модуля программного обеспечения, один работает на PowerPC, а другой на компьютере с архитектурой x86. Два модуля взаимодействуют с использованием сгенерированных функций ASN.1. PowerPC с прямым порядком байтов, а x86 - с прямым порядком байтов. Я не получаю ожидаемые данные от x86 в PowerPC. Может ли endianess быть проблемой при использовании asn.1?

3 ответа

Решение

Я не уверен, относится ли ваш вопрос к стандартам ASN.1 или к какому-либо конкретному инструменту, который вы используете. Если это первое, то ответ заключается в том, что биты в проводе, созданные правилами кодирования ASN.1 (BER, PER и т. Д.), Не зависят от порядкового номера компьютера, на котором закодированы данные.

Байты, передаваемые по проводам, должны быть закодированы как big-endian. Смотрите: http://lists.asn1.org/pipermail/asn1/2004-August/000017.html

Почему вы не отладили полученные данные и не сравнили их с оригиналом? Разве это не намного проще и быстрее, чем задавать вопрос здесь? Достаточно просто точки останова

Как правило, любые многобайтовые данные, которые хранятся в памяти или передаются между компьютерами, должны следовать определенному порядку байтов, или вы должны включить информацию о порядке байтов в поток и, если необходимо, обратить данные в обратном направлении в приемнике

Эти два модуля взаимодействуют с помощью функций, сгенерированных ASN.1. [...] Может ли порядок байтов быть проблемой при использовании ASN.1?

Давайте разберемся с этим. У этой проблемы есть 3 уровня.

  1. Нотация ASN.1 и соответствующая спецификация предназначены для "абстрактной" синтаксической нотации. Его не волнует, как кодируются значения.

  2. Кодирование значений (описываемое схемой ASN.1) обрабатывается схемами "кодирования" ASN.1; например, BER, CER, DER, PER и так далее. (Википедия перечисляет 11 различных схем.) Чтобы узнать, чувствительна ли конкретная схема к "порядку байтов", вам нужно будет посмотреть соответствующую спецификацию1.

  3. Если вы используете сгенерированные функции для кодирования и декодирования ASN.1, то именно здесь будут решаться вопросы чувствительности к порядку байтов. На самом деле это будет зависеть от того, как поставщик реализовал генераторы и что делает сгенерированный код.

Итак, чтобы получить окончательный ответ для вашего конкретного случая, вам необходимо выяснить, какую кодировку вы используете (BER, PER и т. Д.), А затем прочитать документацию поставщика. Однако я ожидал, что генератор ASN.1 хорошего качества будет генерировать функции, которые скрывают любые проблемы с порядком байтов в кодировке ASN.1 из прикладной программы.

Другой способ выяснить, является ли это источником вашей проблемы, - написать простой тест. Разработайте простую схему ASN.1, сгенерируйте функции, разверните на своих двух (или более) платформах и посмотрите, сможете ли вы передать простые целые числа.


1 - Насколько я понимаю спецификацию BER, BER использует кодировку для целых чисел, которая не зависит от порядка байтов отправителя или получателя. Вы можете найти спецификации, перейдя по ссылкам "внешние ссылки" на странице Википедии.

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