---
title: 编解码库使用
description: "- 编解码库libhiasn1.so，位于“/usr/local/ksl/lib”下。用户可以在编译源码时链接此库，提供用于将用户数据编码成码流，或将码流解码成用户数据的接口。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/240RC2/accel/kunpengaccel_ksl_16_0154.html
sourcePath: /source/zh/kunpengboostkithistory/240RC2/accel/kunpengaccel_ksl_16_0154.html
indexId: 5c89c8f80ea19e75b7b8c3406562a2a46e080140a0847654d78903322fedbb4676
---
# 编解码库使用

- 编解码库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
```
