我可以使用 C# BerConverter.Encode() 指定应用程序或特定于上下文的标记吗?
Can I specify an Application or Context-Specific tag with C# BerConverter.Encode()?
.NET 的 System.DirectoryServices.Protocols 程序集指定了一个轻量级的 ASN.1 BER 编码器,但文档不是很好:BerConverter
.
您可以通过指定格式字符串和要编码的对象列表来调用它。
INTEGER
s可以用格式字符i
或e
编码
OCTET STRING
s可以用o
字符编码
SEQUENCE
s可以用{
和}
编码
- 等等
我真的很想使用这个简单的转换器,这样我就不必承担额外的依赖性。承担依赖性是不可取的,因为 C# 可从 Powershell 调用,并且分发一个用 C# 做一些花哨的脚本是很好的,只要它不需要 .NET 不包含的程序集。
但是,BerConverter 似乎无法指定应用程序或上下文特定标签,这些标签通常用于消除 ASN.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]
或 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
.NET 的 System.DirectoryServices.Protocols 程序集指定了一个轻量级的 ASN.1 BER 编码器,但文档不是很好:BerConverter
.
您可以通过指定格式字符串和要编码的对象列表来调用它。
INTEGER
s可以用格式字符i
或e
编码
OCTET STRING
s可以用o
字符编码SEQUENCE
s可以用{
和}
编码
- 等等
我真的很想使用这个简单的转换器,这样我就不必承担额外的依赖性。承担依赖性是不可取的,因为 C# 可从 Powershell 调用,并且分发一个用 C# 做一些花哨的脚本是很好的,只要它不需要 .NET 不包含的程序集。
但是,BerConverter 似乎无法指定应用程序或上下文特定标签,这些标签通常用于消除 ASN.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]
或 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