编解码库使用
- 编解码库libhiasn1.so,位于“/usr/local/ksl/lib”下。用户可以在编译源码时链接此库,提供用于将用户数据编码成码流,或将码流解码成用户数据的接口。
- 编解码接口定义头文件,位于“/usr/local/ksl/include/hiasn1/”下,KSL_ASN1相关数据结构和接口定义位于此目录下。
本章节将演示如何使用编译工具使用中解析asn1文件生成的C代码文件,通过调用KSL_ASN1的编解码库接口,实现将已有数据编码成流,及如何将流解码为数据的方法。
- 在“exports/test”目录下新建一个code_test.c文件。
vim code_test.c
- 按“i”进入编辑模式,在main函数中填写需要编码的数据结构。
// MyType类型在codec_interfaces.h中定义 MyType data = { .boolType = 0, .intType = 10, .enumType = MYTYPE_ENUMTYPE_B, .bitStrType = { .bitCnt = 24, .item = "bit" }, .octStrType = { .len = 12, .item = "Octet String" }, .seqOfType = { .cnt = 3, .item = { -1, 0, 255, } }, .choiceType = { .choice = MYTYPE_CHOICETYPE_B, .u = { .b = 1, } }, };
- 准备缓冲区buffer和上下文ctx结构。
// 缓冲区大小 #define BUF_SIZE 128 // 缓冲区 uint8_t buffer[BUF_SIZE] = {0}; // 缓冲区结构体 Asn1EncodeBufStru buf = {BUF_SIZE, buffer, 0}; // 上下文结构体 AsnCtx ctx = {0}; // 设置缓冲区 ctx.buf = &buf;
- 获取结构对应的描述符。
// 获取结构对应的描述符 AsnDescriptor* desc = CODEC_GET_TEST(CODEC_IDX_TEST_MYTYPE);
- 编码。
// 编码 desc->enc(desc, &data, &ctx); if (ctx.ret != ASN1_SUCC) { printf("failed to encoding data: Error(%u)\n", ctx.ret); return 1; }
- 打印生成的码流。
uint32_t encoded_bytes = buf.bitIdx >> 3; for (uint32_t i = 0; i < encoded_bytes; ++i) { printf("%02X ", buffer[i]); } printf("\n"); /* 30 2E 80 01 00 81 01 0A 82 01 01 83 04 00 62 69 74 84 0C 4F 63 74 65 74 20 53 74 72 69 6E 67 A5 0A 02 01 FF 02 01 00 02 02 00 FF A6 03 81 01 01 */
- 使用生成的码流进行解码。
// 解码 MyType decoded = {0}; buf.bitIdx = 0; desc->dec(desc, &decoded, &ctx); if (ctx.ret != ASN1_SUCC) { printf("failed to decoding data: Error(%u)\n", ctx.ret); return 1; } // 检验解码数据是否与原数据一致 if (!memcmp(&data, &decoded, sizeof(MyType)) { printf("ok!\n"); } /* ok! */
- 按“Esc”键,输入:wq,按“Enter”保存并退出编辑。
- 编译运行。
gcc exports/test/*.c -I /usr/local/ksl/include/hiasn1/ -L /usr/local/ksl/lib/ -lhiasn1 -lsecurec -o codec_test ./codec_test
父主题: 使用说明