非常教程

Erlang 20参考手册

asn1

asn1ct

模块

asn1ct

模块摘要

ASN.1编译器和编译时支持函数

描述

ASN.1编译器将ASN.1模块作为输入,并生成相应的Erlang模块,该模块可对指定的数据类型进行编码和解码。或者,编译器使用指定所有输入模块的指定模块,并生成具有编码/解码功能的模块。另外,在开发处理ASN.1数据(编码为BERPER)的应用程序时,可以使用一些通用函数。

默认情况下,在OTP 17中,BIT STRINGOCTET STRINGErlang的术语类型的表示被改变。BIT STRING值现在是Erlang位串,OCTET STRING值是二进制。此外,未解码的打开类型现在包装在一个asn1_OPENTYPE元组中。有关详细信息,请参阅BIT STRINGOCTET STRINGASN.1 Information Objects用户指南。

要恢复到旧类型的表示形式,请使用选项legacy_erlang_types

在OTP R16中,选项被简化了。后端是使用其中一个选项选择berperuper。选项optimizenifdriver选项不再是必需的(如果使用它们,ASN.1编译器会生成警告)。选项ber_binper_binuper_bin选项仍然有效,但会生成警告。

OTP R 16中的另一个变化是生成的函数encode/2总是返回二进制文件。功能encode/2BER后端用来返回一个iolist。

出口

compile(Asn1module) -> ok | {error, Reason}compile(Asn1module, Options) -> ok | {error, Reason}

类型

编译ASN.1模块Asn1module并生成一个Erlang模块。Asn1module.erl中定义的类型的编码和解码函数。Asn1module对于模块中定义的每个ASN.1值,生成一个Erlang函数,该函数返回Erlang表示中的值。

如果Asn1module是没有扩展名的文件名,则首先".asn1"假设,然后".asn",最后".py"(与旧的ASN.1编译器兼容)。Asn1module可以是完整路径名(相对或绝对),包括具有(或不具有)扩展名的文件名。

如果需要将一组ASN.1模块编译成具有编码/解码功能的Erlang文件,请确保在配置文件中列出所有涉及的文件。此配置文件必须具有双扩展".set.asn"".asn"可替代地".asn1"".py")。列出引号(“”)中的输入文件名,文件中每行一个。如果输入文件是File1.asn,,File2.asnFile3.asn,配置文件必须如下所示:

File1.asn
File2.asn
File3.asn

这种情况下的输出文件从配置文件中获取它们的名称。如果配置文件是命名的SetOfFiles.set.asn,则输出文件的名称是SetOfFiles.hrl, SetOfFiles.erl, and SetOfFiles.asn1db

有时在一个系统ASN.1模块,不同的默认标签模式,例如,AUTOMATICIMPLICIT,或EXPLICIT。多文件编译解决了默认标记,就好像这些模块是单独编译的一样。

名称冲突是在多文件编译中可能发生的另一个不必要的影响。编译器通过以下两种方式之一解决了这个问题:

  • 如果定义相同,则输出模块只保留一个具有原始名称的定义。
  • 如果定义具有相同的名称,并且定义不同,则重命名它们。新的名称是定义名称和连接的原始模块名。

如果发生名称冲突,编译器将报告"NOTICE: ..."消息,该消息指示是否重命名了定义,以及必须用于编码/解码数据的新名称。

Options对象的选项的列表。ASN.1应用于Erlang编译器的编译器和选项。后者不被承认为ASN.1具体而言。可供选择的办法如下:

ber | per | uper

要使用的编码规则。支持的编码规则是基本编码规则%28 BER%29、压缩编码规则%28%29对齐和每条未对齐编码规则。如果省略编码规则选项,ber是默认的。

生成的Erlang模块始终具有与ASN.1模块。因此,每个编码规则只有一个。ASN.1模块可以在运行时使用。

der

使用这个选项,选择了可分辨编码规则(DER)。DER被认为是BER编码规则的一个特殊变体。因此,这个选项只能与选项一起使用ber。此选项有时会在编码时添加排序和值检查,这意味着编码较慢。解码例程与for相同ber

maps

此选项更改类型的表示SEQUENCESET使用地图(而不是记录)。该选项还可以抑制.hrl文件的生成。

有关详细信息,请参见使用说明书Map representation for SEQUENCE and SET中的章节。

compact_bit_string

BIT STRING类型被解码为“紧凑符号”。新代码不建议使用此选项。该选项不能与选项结合使用maps

有关详细信息,请参见使用说明书BIT STRING中的章节。

这个选项意味着选项legacy_erlang_types

legacy_bit_string

BIT STRING类型被解码为传统格式,即一个零和一个列表。新代码不建议使用此选项。该选项不能与选项结合使用maps

有关详细信息,请参见使用说明书BIT STRING中的章节

这个选项意味着选项legacy_erlang_types

legacy_erlang_types

使用相同的Erlang类型来表示BIT STRINGOCTET STRING就像OTP R16一样。

有关详细信息,请参阅用户指南中的章节BIT STRING和章节OCTET STRING

新代码不建议使用此选项。该选项不能与选项结合使用maps

{n2n, EnumTypeName}

告诉编译器生成用于名称(作为原子)和数字之间的转换的函数,反之亦然EnumTypeName。可以有多个此选项来指定几个类型名称。类型名称必须按照ENUMERATIONSASN.1规范进行声明。

如果EnumTypeNameASN.1规范中不存在,编译将以错误代码停止。

所生成的转换函数被命名name2num_EnumTypeName/1num2name_EnumTypeName/1

noobj

不要编译(即不生成目标代码)生成的.erl文件。如果省略此选项,则编译生成的Erlang模块。

{i, IncludeDir}

IncludeDir的搜索路径.asn1dbASN.1源文件。编译器试图打开.asn1db当模块从另一个模块导入定义时,ASN.1模块。如果没有.asn1db文件,则ASN.1解析源文件。几个{i, IncludeDir}可以给予。

{outdir, Dir}

指定目录Dir所有生成的文件都要放在其中。如果省略此选项,则文件将放置在当前目录中。

asn1config

当使用专用解码器之一,独占或选择性解码时,必须在配置文件中给出指令。选项asn1config启用专门的解码并获取有关的配置文件。配置文件与ASN.1规范具有相同的名称,但带有扩展名.asn1config

有关独占解码的说明,请参见使用说明书Exclusive Decode中的章节。

有关选择性解码的说明,请参阅Selective Decode用户指南中的部分。

undec_rest

保存消息的缓冲区,正在解码时,也可以有以下字节。下面的字节现在可以与解码后的值一起返回。如果使用此选项编译ASN.1规范,则为元组{ok, Value, Rest}会被归还。Rest可以是列表或者二进制。编译器的早期版本忽略了以下字节。

no_ok_wrapper

使用此选项,生成的encode/2decode/2函数不会将成功的返回值包装在{ok,...}元组。如果发生任何错误,将引发异常。

{macro_name_prefix, Prefix}

编译器生成的所有宏名都以Prefix当包含相同名称的宏的多个协议包含在单个模块中时,这是非常有用的。

{record_name_prefix, Prefix}

编译器生成的所有记录名称都以Prefix当包含相同名称的记录的多个协议包含在单个模块中时,这是非常有用的。

verbose

会导致编译器提供更详细的信息来描述它正在做的事情。

warnings_as_errors

导致将警告视为错误。

生成的最后一步将传递应用的任何其他选项。.erl文件被编译。

编译器生成以下文件:

  • Asn1module.hrl(如果有的话SET或被SEQUENCE定义)
  • Asn1module.erl-Erlang模块,具有编码、解码和值功能
  • Asn1module.asn1db-编译器在模块时使用的中间格式IMPORT彼此的定义。

value(Module, Type) -> {ok, Value} | {error, Reason}

类型

返回一个Erlang项,它是ASN.1类型Type该值是一个随机值,随后对该函数的调用将在大多数类型中返回不同的值。

目前,value函数具有许多局限性。从本质上讲,它将主要适用于基于1997年ASN.1标准的旧规范,但不适用于大多数现代风格的应用程序。另一个限制是value如果更改代码生成策略的选项(如选项),则函数可能无法工作。macro_name_prefixrecord_name_prefix已经被利用了。

test(Module) -> ok | {error, Reason}test(Module, Type | Options) -> ok | {error, Reason}test(Module, Type, Value | Options) -> ok | {error, Reason}

类型

执行类型的编码和解码的测试。Module此函数调用生成的函数。此函数在测试期间非常有用,可以确保生成的编码和解码函数以及一般运行时支持功能按预期工作。

目前,test功能有很多局限性。从本质上讲,它们将主要用于基于1997年ASN.1标准的旧规范,但不适用于大多数现代风格的应用程序。另一个限制是test如果更改代码生成策略的选项(如选项),则函数可能无法工作。macro_name_prefixrecord_name_prefix已经被利用了。

  • test/1中的所有类型进行迭代。Module...
  • test/2试验类型Type随机值。
  • test/3试验类型Type带着Value...

从原理上讲,模块中的每种类型都会发生以下情况:

{ok, Value} = asn1ct:value(Module, Type),
{ok, Bytes} = Module:encode(Type, Value),
{ok, Value} = Module:decode(Type, Bytes).

test函数使用*.asn1db所有包含模块的文件。如果它们位于与当前工作目录不同的目录中,请使用include选项添加路径。只有在自动生成值时才需要这样做。对于静态值,则使用Value不需要任何选择。

Erlang 20

Erlang 是一种通用的面向并发的编程语言,可应付大规模开发活动的程序设计语言和运行环境。

主页 https://www.erlang.org/
源码 https://github.com/erlang/otp
版本 20
发布版本 20.1