- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
昨天我了解到使用 TLV 表示信息格式。
如果您要用 ANSI C 编写可移植 BER TLV 编码器/解码器,您会使用什么数据结构 (*)?
像下面这样的事情会做吗?
struct TlvElement
{
int nTag;
int nLength;
unsigned char *pValue; // Byte array
TlvElement *pNext;
};
(*) 不幸的是我不能为此使用 C++ 和 STL。
最佳答案
来自维基文章:
The type and length are fixed in size (typically 1-4 bytes)
因此,我会将 nTag
和 nLength
更改为某种固定长度的类型。 int
的大小是特定于平台的,这可能会给您带来一些麻烦。为您的协议(protocol)固定它们的大小并使用 int8_t
、int16_t
或 int32_t
等。对于 nLength
,您甚至可以使用无符号。
由于值可以是任何类型,我将使用 void*
作为 pValue
,而不是 unsigned char*
。
你将如何使用这个数据结构?您希望如何访问不同的 TLV?
我的观点是 - 您需要链表吗?或者,对于您的案例/应用程序/用途/等,链表是否是最佳选项?
我想说的是,您可以删除 pNext
元素,只将 TLV 视为(动态增长的)数组的元素。这实际上取决于您的需求。
很可能,当您实现 TLV 时,您需要通过某种连接发送它们,对吗?如果是这样,您需要考虑一些协议(protocol)。我会做这样的事情——在一开始就发送 TLV 的总数,我不会使用链表,而是使用动态数组。
你应该小心通过网络发送这样的数据结构 - pNext
指针将无效,它们必须在连接的另一端重置。
您还需要小心发送数据,但我想您知道这些事情。我只是想提一下他们。
编辑 我发现您在理解嵌套 TLV 的含义时遇到一些问题。
嵌套的 TLV 只是一个 TLV 元素,它具有 TLV 类型的值。而这与 TLV 的“容器”——动态数组或链表无关。
这里有一个未经测试的例子,只是为了理解这个想法。我会这样做:
struct TLV
{
uint32_t nTag;
uint32_t nLength;
void* pValue;
};
// created dynamic array with 3 TLVs:
TLV* pMyTLVs = malloc( 3 * sizeof( struct TLV ) );
// set the first 2 TLVs, some primitives, for example
// ..
// now, set the third TLV to be nested:
pMyTLVs[ 2 ].nTag = ...; // set some tag, that will indicate nested TLV
pMyTLVs[ 2 ].nLength = ...; // set length of the TLV element
pMyTLVs[ 2 ].pValue = malloc( sizeof( struct TLV ) );
// get pointer to the new, _nested_ TLV:
TLV* pNested = (TLV*)pMyTLVs[ 2 ].pValue;
// now use the pNested TLV as an usual TLV:
pNested->nTag = ...;
pNested->nLength = ...;
pNested->pValue = ...;
// of course, pNested is not absolutely necessary, you may use directly
// pMyTLVs[ 2 ].pValue->...;
// but using pNested, makes the code more clear
注意:再说一次,这不是经过测试的代码,但我想您已经明白了。希望对您有所帮助。
关于c - 在 ANSI C 中表示 BER TLV 数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11913299/
我正在尝试学习和理解 BER(基本编码规则)。 我一直在使用网站http://asn1-playground.oss.com/试验不同的 ASN.1 对象并使用 BER 对其进行编码。 然而,即使是最
我正在尝试使用 Apache Harmony ASN.1/BER 类解析 LDAP 绑定(bind)请求(可以使用另一个库,我只是选择它,因为它具有 Apache 许可证)。 我的问题是关于 ASN.
我正在使用 Java 语言开发 SNMP 管理器。我目前正在开发一个由 Netty 的强大功能支持的自定义 ASN/BER 编解码器。我已经很好地了解并理解了底层的东西,但我以前从未使用过协议(pro
我在他们所指的文档中找到了 简单的 TLV 和 BER-TLV .我查看了大多数 EMV 和 GP 文档,但他们没有提到不同之处。 谁能帮我理解两者的区别? 最佳答案 ISO/IEC 7816-4 中
我有一个关于使用公钥加密消息的问题。 我想用包含在字符串中的公钥 RSA-4096 加密字符串(让我们说 "test" )。 让我们说: -----BEGIN PUBLIC KEY----- MIIC
我一直致力于使用 Crypto++ 的数字签名者和验证者。我遇到了以下问题:我的签名者和验证者在使用第一个示例(生成一个 RSA key 对并保存它)以编程方式生成的公钥和私钥上运行良好 wiki .
我遇到了与 asked here 类似的问题.我有一个我认为是 DER 编码的 RSA PKCS#1 公钥,我想用它来验证我拥有的其他一些数据/签名,但我什至无法进行解码。 我使用的是在该问题的解决方
要构建嵌套 TLV 元素(例如 6F1A840E315041592E5359532E4444463031A5088801025F2D02656E),我使用以下数据结构: typedef struct
我有一个 .BER 格式的编码文件,但无法解码。 经过搜索,我发现我需要使用 ASN1 库才能解码该文件并使其可读。 有人可以指导我如何在 python 上使用 ASN1 库解码 .BER 文件吗?
请原谅我的英语不好。我有一个十进制数:0.15625。 (这是示例)http://www.strozhevsky.com/free_docs/asn1_in_simple_words.pdf (第5页
我是 Java 的新手,所以我想使用标准解决方案来完成标准任务。标签和值的长度未知。 最佳答案 您可以使用这个 BER-TLV 解析器:source code on git。 示例: 如何解析 byt
有几种工具可以自动生成用于读写 BER 编码文件的 C++(或其他)代码。在我的 C++ 项目中,我需要库来读取和修改 BER 编码文件。我无法根据给定的数据结构生成 C++ 类,因为没有给定的数据结
我正在查看可以在 location 上看到的 SNMPBEECodec 特别是我正在查看函数 encodeLength() 我感兴趣的片段 int numBytes = 0;
我正在构建一个 Ionic 应用程序,并希望为 iOS 构建它。它没有用。我收到一个错误,指出找不到模块。过了一会儿,我通过使用 npm install MODULENAME -g 安装了几个模块来解
昨天我了解到使用 TLV 表示信息格式。 如果您要用 ANSI C 编写可移植 BER TLV 编码器/解码器,您会使用什么数据结构 (*)? 像下面这样的事情会做吗? struct TlvEleme
我一直在阅读 X.690“信息技术 – ASN.1 编码规则:基本编码规则 (BER)、规范编码规则 (CER) 和可分辨编码规则 (DER) 规范” 特别是,第 8.5.6.4 (d) 节关于具有可
我需要帮助绘制不同信噪比或 Eb/N0 的 BPSK 调制方案的比特误差曲线或符号误差曲线。该图应显示模拟与理论曲线,但我不知道如何缓解使用恒模算法作为均衡器时出现的问题,这些问题是: (1) Er
正在为 GNU Radio OOT 开发基于 Python 的 BER 置信度计算器。根据引用文献 1,置信度由以下公式计算 但是,引用文献2使用以下公式计算置信度: 第一个问题是关于两个公式的。他们
我一直在搜索这个主题一段时间,但没有找到任何相关答案。所以想把它放在“Stackoverflow”上...... 我们正在尝试对字符串进行编码以便通过 TCP/IP 连接传递它。由于 ASN.1 是最
我打算从智能卡响应中解析 BER-TLV 格式来解释数据。 它类似于JACCAL , 但在 Objective-C 或 C++ 中 任何人都可以引用任何开源项目或任何引用吗? 最佳答案 这是一个解码
我是一名优秀的程序员,十分优秀!