python - 标签不兼容:如何在 pyasn1 中将 SET OF 添加到 SEQUENCE?
问题描述
我已成功使用 pyasn1 对我的大部分数据进行编码,但是在将 SetOf 构造添加到序列时遇到了麻烦。这是表示结构的模式:
TroubleAddingSetOf
DEFINITIONS IMPLICIT TAGS ::=
BEGIN
TopType ::= CHOICE
{
nextType NextType,
topSequence TopSequence
}
TopSequence ::= SEQUENCE OF NextType
NextType ::= CHOICE
{
fourthOne [4] OtherType,
...
}
OtherType ::= SEQUENCE
{
troubleSome [16] TroubleSome OPTIONAL
}
TroubleSome ::= SET SIZE (1..40) OF OCTET STRING (SIZE (1..256))
END -- end of TroubleAddingSetOf
asn1ate 对此进行编译,而我的问题是将 TroubleSome 类型的元素添加到 TopType 对象。这是我试图这样做的代码:
from pyasn1.type import univ, char, namedtype, namedval, tag, constraint, useful
class TroubleSome(univ.SetOf):
pass
TroubleSome.componentType = univ.OctetString().subtype(subtypeSpec=constraint.ValueSizeConstraint(1, 256))
TroubleSome.subtypeSpec=constraint.ValueSizeConstraint(1, 40)
class OtherType(univ.Sequence):
pass
OtherType.componentType = namedtype.NamedTypes(
namedtype.OptionalNamedType('troubleSome', TroubleSome().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 16)))
)
class NextType(univ.Choice):
pass
NextType.componentType = namedtype.NamedTypes(
namedtype.NamedType('fourthOne', OtherType().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 4)))
)
class TopSequence(univ.SequenceOf):
pass
TopSequence.componentType = NextType()
class TopType(univ.Choice):
pass
TopType.componentType = namedtype.NamedTypes(
namedtype.NamedType('nextType', NextType()),
namedtype.NamedType('topSequence', TopSequence())
)
trouble_some = TroubleSome()
trouble_some.setComponentByPosition(0, '12')
trouble_some.setComponentByPosition(1, 'WILL')
trouble_some.setComponentByPosition(2, '3')
top_one = TopType()
# This fails with a PyAsn1Error exception, partly reproduced below:
top_one['nextType']['fourthOne']['troubleSome'] = trouble_some
我不明白如何将 TroubleSome 集放入序列中,并使标签匹配。
这是追溯的一部分:
Traceback (most recent call last):
File "/usr/lib/python3.9/site-packages/pyasn1/type/univ.py", line 2249, in __setitem__
self.setComponentByName(idx, value)
File "/usr/lib/python3.9/site-packages/pyasn1/type/univ.py", line 2415, in setComponentByName
return self.setComponentByPosition(
File "/usr/lib/python3.9/site-packages/pyasn1/type/univ.py", line 2604, in setComponentByPosition
raise error.PyAsn1Error('Component value is tag-incompatible: %r vs %r' % (value, componentType))
pyasn1.error.PyAsn1Error: Component value is tag-incompatible: <TroubleSome value object, tagSet=<TagSet object, tags 0:32:17>, subtypeSpec=<ValueSizeConstraint object, consts 1, 40>, componentType=<OctetString schema object, tagSet <TagSet object, tags 0:0:4>, subtypeSpec <ConstraintsIntersection object, consts <ValueSizeConstraint object, consts 1, 256>>, encoding iso-8859-1>, sizeSpec=<ConstraintsIntersection object>, payload [<OctetString value object, tagSet <TagSet object, tags 0:0:4>, subtypeSpec <ConstraintsIntersection object, consts <ValueSizeConstraint object, consts 1, 256>>, encoding iso-8859-1, payload [12]>, <OctetString value object, tagSet <TagSet object, tags 0:0:4>, subtypeSpec <ConstraintsIntersection object, consts <ValueSizeConstraint object, consts 1, 256>>, encoding iso-8859-1, payload [WILL]>, <OctetString value object, tagSet <TagSet object, tags 0:0:4>, subtypeSpec <ConstraintsIntersection object, consts <ValueSizeConstraint object, consts 1, 256>>, encoding iso-8859-1, payload [3]>]> vs <NamedTypes object, types <OptionalNamedType object, type troubleSome=<TroubleSome schema object, tagSet=<TagSet object, tags 128:32:16>, subtypeSpec=<ValueSizeConstraint object, consts 1, 40>, componentType=<OctetString schema object, tagSet <TagSet object, tags 0:0:4>, subtypeSpec <ConstraintsIntersection object, consts <ValueSizeConstraint object, consts 1, 256>>, encoding iso-8859-1>, sizeSpec=<ConstraintsIntersection object>>>>
这是在 Fedora 33 上:
$ rpm -q python3 python3-pyasn1
python3-3.9.2-1.fc33.x86_64
python3-pyasn1-0.4.8-3.fc33.noarch
我在第 2246 行将 print() 语句插入到 univ.py 中,导致回溯中的行号比 F33 上未修改的 univ.py 增加了 1。
解决方案
好的,我的优秀同事找到了解决方案:
top_one['nextType']['fourthOne']['troubleSome'].setComponentByPosition(0, '12')
top_one['nextType']['fourthOne']['troubleSome'].setComponentByPosition(1, 'WILL')
top_one['nextType']['fourthOne']['troubleSome'].setComponentByPosition(2, '3')
推荐阅读
- google-analytics - 扁平化分析数据 - hit.type PAGE 丢失
- django - 如何重命名从 Django 模型自动生成的 GraphQL 类型字段?
- python - 在散点图上添加颜色条标签作为文本
- java - 在基于 java 的 Spring 配置中使用非公共类
- java - Java 8 时间 - 将 Javascript 的 Date().getTimezoneOffset 转换为 ZoneOffset
- java - 如何在 spring-boot 多模块 Java 11 项目中添加 Spark 依赖项
- c# - 如何在 C# 中获取网格控件列以显示带两位小数的价格?
- sql - 如何在不重复员工 ID 的情况下计算表中的姓氏
- c# - 如何构建具有一些预定义配置的其他依赖项目的 csproj
- node.js - 我的 Lambda 在代码完成之前结束 - node.js