Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以用C#BerConverter.Encode()指定应用程序或特定于上下文的标记吗?_C#_Encoding_Asn.1_Ber - Fatal编程技术网

我可以用C#BerConverter.Encode()指定应用程序或特定于上下文的标记吗?

我可以用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中没有的程序集

.NET的System.DirectoryServices.Protocols程序集指定了一个轻量级ASN.1 BER编码器,但文档并不完善:

您可以通过指定格式字符串和要编码的对象列表来调用它

  • INTEGER
    s可以使用格式字符
    i
    e
  • OCTET字符串
    s可以使用
    o
    字符进行编码
  • 序列
    s可以用
    {
    }
  • 等等
我真的很想利用这个简单的转换器,这样我就不必承担额外的依赖性。使用依赖项是不可取的,因为C#可以从Powershell调用,并且分发一个脚本来处理C#非常好,只要它不需要.NET中没有的程序集

然而,BerConverter似乎没有办法指定应用程序或特定于上下文的标记,这些标记通常用于消除ASN.1中的歧义,例如,当构造类型的组件标记为
可选时

因此,我可以对以下内容进行编码:

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()
。它有更好的文档。见下面的答案。