Является ли порядковый номер кода 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 уровня.
Нотация ASN.1 и соответствующая спецификация предназначены для "абстрактной" синтаксической нотации. Его не волнует, как кодируются значения.
Кодирование значений (описываемое схемой ASN.1) обрабатывается схемами "кодирования" ASN.1; например, BER, CER, DER, PER и так далее. (Википедия перечисляет 11 различных схем.) Чтобы узнать, чувствительна ли конкретная схема к "порядку байтов", вам нужно будет посмотреть соответствующую спецификацию1.
Если вы используете сгенерированные функции для кодирования и декодирования ASN.1, то именно здесь будут решаться вопросы чувствительности к порядку байтов. На самом деле это будет зависеть от того, как поставщик реализовал генераторы и что делает сгенерированный код.
Итак, чтобы получить окончательный ответ для вашего конкретного случая, вам необходимо выяснить, какую кодировку вы используете (BER, PER и т. Д.), А затем прочитать документацию поставщика. Однако я ожидал, что генератор ASN.1 хорошего качества будет генерировать функции, которые скрывают любые проблемы с порядком байтов в кодировке ASN.1 из прикладной программы.
Другой способ выяснить, является ли это источником вашей проблемы, - написать простой тест. Разработайте простую схему ASN.1, сгенерируйте функции, разверните на своих двух (или более) платформах и посмотрите, сможете ли вы передать простые целые числа.
1 - Насколько я понимаю спецификацию BER, BER использует кодировку для целых чисел, которая не зависит от порядка байтов отправителя или получателя. Вы можете найти спецификации, перейдя по ссылкам "внешние ссылки" на странице Википедии.