鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

编解码库使用

  • 编解码库libhiasn1.so,位于“/usr/local/ksl/lib”下。用户可以在编译源码时链接此库,提供用于将用户数据编码成码流,或将码流解码成用户数据的接口。
  • 编解码接口定义头文件,位于“/usr/local/ksl/include/hiasn1/”下,KSL_ASN1相关数据结构和接口定义位于此目录下。

本章节将演示如何使用编译工具使用中解析asn1文件生成的C代码文件,通过调用KSL_ASN1的编解码库接口,实现将已有数据编码成流,及如何将流解码为数据的方法。

  1. “exports/test”目录下新建一个code_test.c文件。
    vim code_test.c
  2. 按“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, 
            } 
        }, 
    };
  3. 准备缓冲区buffer和上下文ctx结构。
    // 缓冲区大小 
    #define BUF_SIZE 128 
    // 缓冲区 
    uint8_t buffer[BUF_SIZE] = {0}; 
    // 缓冲区结构体 
    Asn1EncodeBufStru buf = {BUF_SIZE, buffer, 0}; 
    // 上下文结构体 
    AsnCtx ctx = {0}; 
    // 设置缓冲区 
    ctx.buf = &buf;
  4. 获取结构对应的描述符。
    // 获取结构对应的描述符 
    AsnDescriptor* desc = CODEC_GET_TEST(CODEC_IDX_TEST_MYTYPE);
  5. 编码。
    // 编码 
    desc->enc(desc, &data, &ctx); 
    if (ctx.ret != ASN1_SUCC) { 
        printf("failed to encoding data: Error(%u)\n", ctx.ret); 
        return 1; 
    } 
  6. 打印生成的码流。
    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
    */
  7. 使用生成的码流进行解码。
     // 解码 
    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!
    */
  8. 按“Esc”键,输入:wq,按“Enter”保存并退出编辑。
  9. 编译运行。
     gcc exports/test/*.c -I /usr/local/ksl/include/hiasn1/ -L /usr/local/ksl/lib/ -lhiasn1 -lsecurec -o codec_test
    ./codec_test