0

asn.1文件(test.asn)如下,我想用python对文件进行编码得到asn.1的位串,但是当我用python按照not ber编码时,出现错误。我不知道异常的含义是什么。请帮忙检查一下。

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)
4

1 回答 1

0

asn1tools 在编码 BIT STRING 时不会考虑所有约束。asn1tools 将对用户给出的位数进行编码,如果这与 ASN.1 规范中的位数不同,则编码仍然成功。但是,在解码时会考虑约束,并且在您的情况下会引发 OutOfDataError 异常,因为解码BIT STRING (SIZE (40))时编码的 2 位小于 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 中。

/埃里克

于 2018-06-28T20:16:12.137 回答