【问题标题】:asn1tools to encoded the asn.1 failedasn1tools 编码 asn.1 失败
【发布时间】:2018-06-05 14:52:04
【问题描述】:

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)

【问题讨论】:

    标签: asn.1


    【解决方案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规范使用Unaligned Packed Encoding Rules,在asn1tools中为uper

    /埃里克

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-27
      • 2022-01-22
      • 2012-04-11
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多