我可以用C#BerConverter.Encode()指定应用程序或特定于上下文的标记吗?
.NET的System.DirectoryServices.Protocols程序集指定了一个轻量级ASN.1 BER编码器,但文档并不完善: 您可以通过指定格式字符串和要编码的对象列表来调用它我可以用C#BerConverter.Encode()指定应用程序或特定于上下文的标记吗?,c#,encoding,asn.1,ber,C#,Encoding,Asn.1,Ber,.NET的System.DirectoryServices.Protocols程序集指定了一个轻量级ASN.1 BER编码器,但文档并不完善: 您可以通过指定格式字符串和要编码的对象列表来调用它 INTEGERs可以使用格式字符i或e OCTET字符串s可以使用o字符进行编码 序列s可以用{和} 等等 我真的很想利用这个简单的转换器,这样我就不必承担额外的依赖性。使用依赖项是不可取的,因为C#可以从Powershell调用,并且分发一个脚本来处理C#非常好,只要它不需要.NET中没有的程序集
s可以使用格式字符INTEGER
或i
e
s可以使用OCTET字符串
字符进行编码o
s可以用序列
和{
}
- 等等
可选时
因此,我可以对以下内容进行编码:
BerConverter.Encode({i{i}),1,2代码>
其中:
3084 00 00 0c 02 01 01 3084 00 00 03 02 02
但是,如果第二个序列需要是[Application 1]
或61
。。。我不确定在编码时要在格式字符串中放入什么来发出这种信息
BerConverter有这个功能吗?我不知道为什么我不直接做这件事,但我使用了反编译器来查看代码。我发现,BerConverter.Encode()
是基于的,它有更好的文档
从文档中:
字符:'t'
说明:
标记。下一个参数是ber_标记,它指定要覆盖写入ber元素的下一个元素的标记。这在电话中起作用
因此,我可以将代码更改为:
BerConverter.Encode({it{i}}),1,0x61,2)
这允许我将标记值设置为0x61
,代码发出:
30 84 00 00 0c 02 01 01 61 84 00 00 00 03 02 01 02
您可以尝试使用反编译器(例如ILSpy)并查看BerConverter代码以了解其功能。@bosonix感谢您的评论。我不知道为什么我不想反编译。我使用JetBrains dotPeek来反编译BerConverter.Encode()
,我发现它在幕后调用ber\u printf()
。它有更好的文档。见下面的答案。