首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASN.1序列混淆

ASN.1序列混淆
EN

Stack Overflow用户
提问于 2013-07-17 21:06:53
回答 2查看 2.5K关注 0票数 1

我正在研究ASN.1的语法,并在网上阅读了很多相关材料:

http://www.itu.int/rec/T-REC-X.690-200811-I/en

http://luca.ntop.org/Teaching/Appunti/asn1.html

http://www.obj-sys.com/asn1tutorial/node11.html

我对ASN.1 SEQUENCE类型的编码非常困惑。一般来说,我意识到SEQUENCE基本上是一个聚合--在大多数编程语言中,我们称之为对象或实例。它基本上是一个名称/值对的列表,类似于一个JSON对象。但是与JSON对象不同的是,ASN.1 SEQUENCE有一个隐式模式,因为它是一个“类”的实例。

因此,SEQUENCE的类/架构可能如下所示:

代码语言:javascript
复制
{
  name  UTF8String
  age   INTEGER
}

该模式的一个实例可以是SEQUENCE

代码语言:javascript
复制
{
  "John Smith"
  42
}

但是,我完全不明白如何在实际的误码编码中区分类和实例。事实上,我很困惑,我甚至不确定ASN.1 SEQUENCE是类定义还是类的实例。

文档似乎暗示它是一个实例:

序列值的8.9编码 8.9.1序列值的编码应被构造。 8.9.2内容八进制应包括ASN.1序列类型定义中列出的每个类型的一个数据值的完整编码,按照它们在定义中的出现顺序,除非该类型是用关键字可选或关键字默认值引用的。 8.9.3数据值的编码可能(但不需要)存在于使用关键字可选或关键字默认值引用的类型中。如果存在,则应出现在与ASN.1定义中类型的外观相对应的编码中。

因此,序列似乎只是数据值的列表,必须与某些模式(类)相对应。但是ASN.1没有CLASS类型,那么如何获得实际的类,所以您知道任何给定序列都是哪个类的实例?

EN

回答 2

Stack Overflow用户

发布于 2013-07-18 17:57:07

假设您编写了以下内容:

代码语言:javascript
复制
R DEFINITIONS AUTOMATIC TAGS ::=

 BEGIN

 USPostalAddress ::= SEQUENCE {

      street     IA5String,

      city       IA5String,

      state      IA5String (SIZE (2)) (FROM("A".."Z")),

      zipcode    IA5String (SIZE (5)) (FROM("0".."9"))

 }

 END

以上开始和结束之间的部分称为“类型分配”。"USPostalAddress“是(用户定义的) "type”的名称。通过编写上面的内容,您已经指定了一个用户定义的类型,并给它起了一个名称。每个序列构造(例如,上面的序列构造)都是“类型”。它是一个复杂的类型,因为它包含一个或多个“字段”,每个字段都有自己的类型。上述类型的可能“值”表示如下:

代码语言:javascript
复制
{ street "1234 Main St.", city "New York", state "NY", zipcode "12345" }

我们讨论的只是类型及其值,而不是类和实例。就像您可以拥有一个类型整数(0.. 15 ),其值是0到15之间的整数,您也可以有一个序列类型,其值是低级值的排列。上面的序列类型是您可以在ASN.1中定义的数据结构(“类型”)的一个非常简单的示例。

(在ASN.1中也有一种叫做“类”的东西,但它是完全不同的东西。)

在ASN.1中,协议的消息通常被指定为顶级类型(通常是序列类型或选择类型)。特定的“消息值”是顶级类型的值。当您手中有一个顶级类型的值时,可以使用标准编码规则之一(BER、PER等)将该值编码到一个比特流中。当您从网络接收到一个以BER、PER等编码的特定ASN.1类型的值的比特流时,您可以对这些位进行解码并获得原始值。

票数 2
EN

Stack Overflow用户

发布于 2013-08-01 09:57:53

ASN.1文件通常包含类型赋值(类型定义),如下所示:

代码语言:javascript
复制
myMessage ::= SEQUENCE
{
    a INTEGER(0..100),
    b INTEGER
}

ASN.1文件中的这些序列类型可以被认为与C++/java中的类或C中的结构定义相同。

序列的实例可以是编码格式(BER、PER、DER等),也可以是程序中的本地格式(对象/变量)。

例如,如何在C代码中实现这些代码:

代码语言:javascript
复制
struct myMessage_t          
{
  int a;
  int b;
};

char buffer[1000];   // BER encoded instance will be stored to this buffer
myMessage_t msg;     // this is the local instance

msg.a = 1;
msg.b = 2;

size_t berLen = berEncode_myMessage( &msg, buffer, sizeof(buffer) );

而解码方则是:

代码语言:javascript
复制
myMessage_t msg2;            
berDecode_myMessage( buffer, berLen, &msg2 );
assert( msg2.a == 1 );

在解码之前,您通常知道什么是最高级别的编码实例类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17710222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档