.NET 的 System.DirectoryServices.Protocols 程序集指定了一个轻量级的 ASN.1 BER 编码器,但文档不是很好:BerConverter
.
您可以通过指定格式字符串和要编码的对象列表来调用它。
INTEGER
可以使用格式字符i
或e
进行编码
OCTET STRING
可以用o
字符编码SEQUENCE
可以用{
和}
编码
- 等等
我真的很想使用这个简单的转换器,这样我就不必承担额外的依赖性。承担依赖性是不可取的,因为 C# 可从 Powershell 调用,并且分发一个用 C# 做一些有趣的事情的脚本是很好的,只要它不需要 .NET 不包含的程序集。
但是,BerConverter 似乎没有办法指定应用程序或上下文特定标签,这些标签通常用于消除 ASN.1 中的歧义,例如当构造类型的组件被标记为 时可选的
因此,我可以对以下内容进行编码:
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]
或 61
...我不确定要在格式字符串中放入什么来发出它在编码中。
BerConverter 有这个能力吗?
最佳答案
我不确定为什么我不直接这样做,而是使用反编译器查看代码。我发现 BerConverter.Encode()
基于 ber_printf()
,它有更好的文档。
来自文档:
Character: 't'
Description:
Tag. The next argument is a ber_tag_t that specifies the tag to override the next element written to the BerElement. This works across calls.
因此,我能够将我的代码更改为:
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
关于c# - 我可以使用 C# BerConverter.Encode() 指定一个应用程序或上下文特定的标签吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40295441/