asn1tools закодировать asn.1 не удалось - PullRequest
0 голосов
/ 05 июня 2018

Файл asn.1 (test.asn) выглядит следующим образом. Я хочу использовать python для кодирования файла, чтобы получить цепочку битов в asn.1, но когда я использую python для кодирования его, как указано ниже,произошла ошибка.Я не знал, что означает исключение.Пожалуйста, помогите проверить это.

RRC DEFINITIONS ::=BEGIN
RRCConnectionRequest-NB ::=     SEQUENCE {

    criticalExtensions                  CHOICE {

        rrcConnectionRequest-r13            RRCConnectionRequest-NB-r13-IEs,

        criticalExtensionsFuture            SEQUENCE {}

    }

}



RRCConnectionRequest-NB-r13-IEs ::=     SEQUENCE {

    ue-Identity-r13                         InitialUE-Identity,

    establishmentCause-r13                  EstablishmentCause-NB-r13,

    multiToneSupport-r13                    ENUMERATED {true}               OPTIONAL,

    multiCarrierSupport-r13                 ENUMERATED {true}               OPTIONAL,

    spare                                   BIT STRING (SIZE (22))

}
EstablishmentCause-NB-r13 ::=           ENUMERATED {

                                        mt-Access, mo-Signalling, mo-Data, mo-ExceptionData,

                                        delayTolerantAccess-v1330, spare3, spare2, spare1}

InitialUE-Identity ::=              CHOICE {

    randomValue                         BIT STRING (SIZE (40))

}



END

Код Python выглядит следующим образом:

def asn_try():
    rrc = asn1tools.compile_files('/home/zhf/py_prj/test.asn','per')

    encoded = rrc.encode('RRCConnectionRequest-NB',
                         {'criticalExtensions': ('rrcConnectionRequest-r13', {
                             'ue-Identity-r13': ('randomValue', (b'01', 2)), 'establishmentCause-r13': 'mt-Access',
                             'multiToneSupport-r13': 'true', 'multiCarrierSupport-r13': 'true', 'spare': (b'01', 2)})})
    print(encoded.hex())
    print(encoded)
    print(rrc.decode('RRCConnectionRequest-NB', encoded))

Но произошла ошибка:

Traceback (most recent call last):
  File "/home/zhf/py_prj/function_test/asn_try.py", line 36, in <module>
    asn_try()
  File "/home/zhf/py_prj/function_test/asn_try.py", line 15, in asn_try
    print(rrc.decode('RRCConnectionRequest-NB', encoded))
  File "/usr/local/lib/python3.6/dist-packages/asn1tools/compiler.py", line 116, in decode
    return self._types[name].decode(data)
  File "/usr/local/lib/python3.6/dist-packages/asn1tools/codecs/per.py", line 1541, in decode
    return self._type.decode(decoder)
  File "/usr/local/lib/python3.6/dist-packages/asn1tools/codecs/per.py", line 764, in decode
    return self.decode_root(decoder)
  File "/usr/local/lib/python3.6/dist-packages/asn1tools/codecs/per.py", line 776, in decode_root
    value = member.decode(decoder)
  File "/usr/local/lib/python3.6/dist-packages/asn1tools/codecs/per.py", line 1354, in decode
    return self.decode_root(decoder)
  File "/usr/local/lib/python3.6/dist-packages/asn1tools/codecs/per.py", line 1365, in decode_root
    return (member.name, member.decode(decoder))
  File "/usr/local/lib/python3.6/dist-packages/asn1tools/codecs/per.py", line 764, in decode
    return self.decode_root(decoder)
  File "/usr/local/lib/python3.6/dist-packages/asn1tools/codecs/per.py", line 776, in decode_root
    value = member.decode(decoder)
  File "/usr/local/lib/python3.6/dist-packages/asn1tools/codecs/per.py", line 1354, in decode
    return self.decode_root(decoder)
  File "/usr/local/lib/python3.6/dist-packages/asn1tools/codecs/per.py", line 1365, in decode_root
    return (member.name, member.decode(decoder))
  File "/usr/local/lib/python3.6/dist-packages/asn1tools/codecs/per.py", line 991, in decode
    value = decoder.read_bits(number_of_bits)
  File "/usr/local/lib/python3.6/dist-packages/asn1tools/codecs/per.py", line 317, in read_bits
    raise OutOfDataError(self.number_of_read_bits())
asn1tools.codecs.per.OutOfDataError: criticalExtensions: ue-Identity-r13: out of data at bit offset 8 (1.0 bytes)

1 Ответ

0 голосов
/ 28 июня 2018

asn1tools не учитывает все ограничения при кодировании BIT STRING.asn1tools будет кодировать количество битов, заданных пользователем, и, если оно отличается от количества битов в спецификации ASN.1, кодирование все еще будет успешным.Однако при декодировании учитывается ограничение, и в вашем случае возникает исключение OutOfDataError, поскольку кодированные 2 бита меньше 40 (см. BIT STRING (SIZE (40))), необходимых при декодировании.Если вы используете данные ниже, то и кодирование, и декодирование работают.

{
    'criticalExtensions': (
        'rrcConnectionRequest-r13',
        {
            'ue-Identity-r13': (
                'randomValue', (b'\x01\x01\x01\x01\x01', 40)
            ),
            'establishmentCause-r13': 'mt-Access',
            'multiToneSupport-r13': 'true',
            'multiCarrierSupport-r13': 'true',
            'spare': (b'\x01\x01\x00', 22)
        }
    )
}

Кроме того, кодек per является выровненным вариантом правил упакованного кодирования.Спецификация 3GPP RRC использует Unaligned Packed Encoding Rules, которая равна uper в asn1tools.

/ Erik

...