c# - 我可以使用 C# BerConverter.Encode() 指定一个应用程序或上下文特定的标签吗?

标签 c# encoding asn.1 ber

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

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

  • INTEGER 可以使用格式字符 ie
  • 进行编码
  • 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/

相关文章:

javascript atob 给出特殊字符串的错误

c - 将大型结构转储到文本文件的一些智能方法

c - 编译osmocom asn1c生成的C代码时出现问题

c - 从 GSM-TCAP asn1 文件生成 C 代码时出错

c# - 在 Winform 中复制 LocalDB 给我一个 'File being used by another process'

c# - 如何为我的单元测试创​​建内存中图标

c# - 使用反射检查属性是否仅为引用类型的 IEnumerable 而不是字符串或值类型

c# - Android中DataInputStream只接收2048字节的数据吗?

java - Tomcat字符编码

c# - 如何从剪贴板中获取正确编码的 HTML?