asn1ct
asn1ct
模块
asn1ct
模块摘要
ASN.1编译器和编译时支持函数
描述
ASN.1编译器将ASN.1模块作为输入,并生成相应的Erlang模块,该模块可对指定的数据类型进行编码和解码。或者,编译器使用指定所有输入模块的指定模块,并生成具有编码/解码功能的模块。另外,在开发处理ASN.1数据(编码为BER
或PER
)的应用程序时,可以使用一些通用函数。
注
默认情况下,在OTP 17中,BIT STRING
和OCTET STRING
Erlang的术语类型的表示被改变。BIT STRING
值现在是Erlang位串,OCTET STRING
值是二进制。此外,未解码的打开类型现在包装在一个asn1_OPENTYPE
元组中。有关详细信息,请参阅BIT STRING
,OCTET STRING
和ASN.1 Information Objects
用户指南。
要恢复到旧类型的表示形式,请使用选项legacy_erlang_types
。
注
在OTP R16中,选项被简化了。后端是使用其中一个选项选择ber
,per
或uper
。选项optimize
,nif
和driver
选项不再是必需的(如果使用它们,ASN.1编译器会生成警告)。选项ber_bin
,per_bin
和uper_bin
选项仍然有效,但会生成警告。
OTP R 16中的另一个变化是生成的函数encode/2
总是返回二进制文件。功能encode/2
为BER
后端用来返回一个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.asn
和File3.asn
,配置文件必须如下所示:
File1.asn
File2.asn
File3.asn
这种情况下的输出文件从配置文件中获取它们的名称。如果配置文件是命名的SetOfFiles.set.asn
,则输出文件的名称是SetOfFiles.hrl, SetOfFiles.erl, and SetOfFiles.asn1db
。
有时在一个系统ASN.1
模块,不同的默认标签模式,例如,AUTOMATIC
,IMPLICIT
,或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
此选项更改类型的表示SEQUENCE
并SET
使用地图(而不是记录)。该选项还可以抑制.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 STRING
和OCTET STRING
就像OTP R16一样。
有关详细信息,请参阅用户指南中的章节BIT STRING
和章节OCTET STRING
。
新代码不建议使用此选项。
该选项不能与选项结合使用maps
。
{n2n, EnumTypeName}
告诉编译器生成用于名称(作为原子)和数字之间的转换的函数,反之亦然EnumTypeName
。可以有多个此选项来指定几个类型名称。类型名称必须按照ENUMERATIONS
ASN.1规范进行声明。
如果EnumTypeName
ASN.1规范中不存在,编译将以错误代码停止。
所生成的转换函数被命名name2num_EnumTypeName/1
和num2name_EnumTypeName/1
。
noobj
不要编译(即不生成目标代码)生成的.erl
文件。如果省略此选项,则编译生成的Erlang模块。
{i, IncludeDir}
加IncludeDir
的搜索路径.asn1db
和ASN.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/2
和decode/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_prefix
和record_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_prefix
和record_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
不需要任何选择。