Я использую код c, сгенерированный asn1c из спецификации протокола TCAP (т. Е. Соответствующий ASN1 файлы). Я могу успешно кодировать пакеты TCAP сгенерированным кодом. Однако попытка «декодировать» связанные потоки байтов не удалась.
Пример кода выглядит следующим образом.
// A real byte stream of a TCAP message:
unsigned char packet_bytes[] = {
0x62, 0x43, 0x48, 0x04, 0x00, 0x18, 0x02, 0x78,
0x6b, 0x1a, 0x28, 0x18, 0x06, 0x07, 0x00, 0x11,
0x86, 0x05, 0x01, 0x01, 0x01, 0xa0, 0x0d, 0x60,
0x0b, 0xa1, 0x09, 0x06, 0x07, 0x04, 0x00, 0x00,
0x01, 0x00, 0x14, 0x03, 0x6c, 0x1f, 0xa1, 0x1d,
0x02, 0x01, 0x00, 0x02, 0x01, 0x2d, 0x30, 0x15,
0x80, 0x07, 0x91, 0x64, 0x21, 0x92, 0x05, 0x31,
0x74, 0x81, 0x01, 0x01, 0x82, 0x07, 0x91, 0x64,
0x21, 0x00, 0x00, 0x90, 0x02
};
// Initializing ...
TCAP_TCMessage_t _pdu, *pdu = &_pdu;
memset(pdu, 0, sizeof(*pdu));
// Decoding:
asn_dec_rval_t dec_ret = ber_decode(NULL, &asn_DEF_TCAP_TCMessage, (void **) &pdu, packet_bytes, sizeof(packet_bytes));
Хотя тип сообщения (в данном случае «Начало») правильно определен, другие параметры не анализируются.
Использование других правил кодирования, т. Е. aper_decode()
и uper_decode()
, также дает сбой. Я был бы благодарен, если кто-нибудь может описать, как использовать автоматически сгенерированный код c для декодирования (разбора) байтовой строки сообщений TCAP.
2 ответа
@Vasil, большое спасибо за ответ.
Какой asn1c вы используете (git commit id) и откуда вы его взяли, так как там довольно много логов?
Я использую ветку mouse07410.
Откуда вы знаете, что Begin правильно обнаружен?
Из поля present
переменной pdu
, которая оценивается с помощью ber_decode (вы можете увидеть тип pdu
в примере кода). Из вывода «Wireshark» для этого потока байтов я знаю, что правильный тип сообщения - Begin
.
Вы можете попробовать скомпилировать с -DASN_EMIT_DEBUG = 1 в CFLAGS (или -DEMIT_ASN_DEBUG = 1 в зависимости от используемой версии asn1c), чтобы получить еще несколько сообщений отладки.
Спасибо за подсказку; это было полезно.
Проблема была связана с файлами asn1, которые я использовал. Я использовал файлы osmocom asn1 и скомпилировал их
ASN=../asn
asn1c $ASN/DialoguePDUs.asn $ASN/tcap.asn $ASN/UnidialoguePDUs.asn
В котором DialoguePortion
определяется следующим образом (обратите внимание, что первое определение прокомментировано):
--DialoguePortion ::= [APPLICATION 11] EXPLICIT EXTERNAL
-- WS adaptation
DialoguePortion ::= [APPLICATION 11] IMPLICIT DialogueOC
DialogueOC ::= OCTET STRING
Чтобы иметь возможность декодировать сообщения TCAP, необходимо использовать первое определение (как в стандартном) то есть DialoguePortion
должен быть определен как
DialoguePortion ::= [APPLICATION 11] EXPLICIT EXTERNAL
При использовании этого последнего определения в файле asn1 и перекомпиляции файлов asn1 проблема решается.
P.S .: Этот вопрос также связан с моей проблемой.
Я использую код c, сгенерированный asn1c из спецификации протокола TCAP
Какой asn1c вы используете (git commit id) и откуда вы его взяли, так как там довольно много логов?
Хотя тип сообщения (в данном случае «Начало») правильно определен, другие параметры не анализируются.
Откуда вы знаете, что Begin правильно обнаружен?
Использование других правил кодирования, то есть aper_decode () и uper_decode (), также завершается ошибкой.
Нет смысла пробовать другие кодировки, так как они не являются двоично-совместимыми.
Я был бы благодарен, если кто-нибудь может описать, как использовать автоматически сгенерированный код c для декодирования (разбора) байтовой строки сообщений TCAP.
Вы используете его правильно и, возможно, где-то в декодере BER есть ошибка.
Вы можете попробовать скомпилировать с -DASN_EMIT_DEBUG=1
в CFLAGS
(или -DEMIT_ASN_DEBUG=1
в зависимости от используемой версии asn1c
), чтобы получить еще несколько сообщений отладки.
Похожие вопросы
Связанные вопросы
Новые вопросы
parsing
Синтаксический анализ относится к разбиению артефакта на составляющие его элементы и получению взаимосвязи между этими элементами. Этот тег не предназначен для вопросов о собственной размещенной платформе Parse (используйте тег [parse-platform]) или разбора ошибок на определенном языке программирования (используйте вместо этого соответствующий языковой тег).