.NET的System.DirectoryServices.Protocols程序集指定了一个轻量级的ASN.1 BER编码器,但文档不是很好:BerConverter
。
您可以通过指定格式字符串和要编码的对象列表来调用它。
INTEGER
可以使用格式字符i
或e
OCTET STRING
可以使用o
字符SEQUENCE
可以使用{
和}
我真的很想使用这个简单的转换器,所以我不需要承担额外的依赖。承担依赖是不可取的,因为C#可以从Powershell调用,并且分发一个用C#做一些奇特的脚本是很好的,只要它不需要.NET不包含的程序集。
但是,BerConverter似乎没有办法指定Application或Context-Specific标记,这些标记通常用于消除ASN.1中的歧义,例如,当构造类型的组件标记为{{1 }}
所以,我可以编码以下内容:
OPTIONAL
给出了:
BerConverter.Encode("{i{i}}", 1, 2);
但是,如果第二个序列需要30 84 00 00 00 0c 02 01 01 30 84 00 00 00 03 02 01 02
或[Application 1]
...我不知道在格式字符串中放入什么以在编码中发出它。
BerConverter是否具备此功能?
答案 0 :(得分:1)
我不确定为什么我不直接这样做,但我使用反编译器来查看代码。我发现BerConverter.Encode()
基于ber_printf()
,它有更好的文档。
来自文档:
字符:'t'
说明强>
代码即可。下一个参数是 ber_tag_t ,它指定标记以覆盖写入 BerElement 的下一个元素。这适用于各种电话。
所以,我能够将我的代码更改为:
BerConverter.Encode("{it{i}}", 1, 0x61, 2)
这允许我将标记值设置为0x61
并且代码会发出:
30 84 00 00 00 0c 02 01 01 61 84 00 00 00 03 02 01 02