asn1tools закодировать asn.1 не удалось
Файл 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 ответ
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 использует правила невыровненного упакованного кодирования, uper
в asn1tools.
/ Эрик