标签不兼容:如何将 SET OF 添加到 pyasn1 中的 SEQUENCE?

如何解决标签不兼容:如何将 SET OF 添加到 pyasn1 中的 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 编译这个,我的问题是向 TopType 对象添加一个 TroubleSome 类型的元素。 这是我尝试执行此操作的代码

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,256>>,encoding iso-8859-1>,sizeSpec=<ConstraintsIntersection object>,payload [<OctetString value object,encoding iso-8859-1,payload [12]>,<OctetString value object,payload [WILL]>,payload [3]>]> vs <NamedTypes object,types <OptionalNamedType object,type troubleSome=<TroubleSome schema object,tags 128:32:16>,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

我在 univ.py 的第 2246 行插入了一个 print() 语句,导致回溯中的行号比 F33 上未修改的 univ.py 增加一个

解决方法

好的,我的优秀同事找到了解决方案:

top_one['nextType']['fourthOne']['troubleSome'].setComponentByPosition(0,'12')
top_one['nextType']['fourthOne']['troubleSome'].setComponentByPosition(1,'WILL')
top_one['nextType']['fourthOne']['troubleSome'].setComponentByPosition(2,'3')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?