---
title: EC接口
description: "EC编解码接口。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengaccel/storage/ksal/kunpengksal_16_0022.html
sourcePath: /source/zh/kunpengaccel/storage/ksal/kunpengksal_16_0022.html
indexId: cc5b67a77e787a8671e92bb0554ee03aa56751c7abcba6e0821920b5bb6abdb061
---
# EC接口

#### 接口描述

EC编解码接口。


#### 接口格式

- int KsalEcEncode(uint8_t **data, uint8_t **parity, struct HecParam *param);
- int KsalEcDecode(uint8_t **data, uint8_t **parity, struct HecParam *param);
- int KsalLrcEncode(uint8_t **data, uint8_t **parity, struct LrcParam *param);
- int KsalLrcDecode(uint8_t **data, uint8_t **parity, struct LrcParam *param);
- int KsalLrcMininumToDecode(uint8_t *minimumToReadBitMap, uint8_t *availChunksBitMap, struct LrcParam *param, uint8_t minimumToReadBitMapLen, uint8_t availChunksBitMapLen);

KsalLrcEncode、KsalLrcDecode、KsalLrcMinimumToDecode仅支持28+3配比。


#### 参数释义

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| data | 指针数组 | 数据块指针数组。 | 输入/输出 |
| parity | 指针数组 | 校验块指针数组。 | 输入/输出 |
| param | 编解码参数指针 | 编解码参数。 | 输入 |
| minimumToReadBitMap | 指针数组 | 最少需要读的块的bitmap信息。 | 输入/输出 |
| availChunksBitMap | 指针数组 | 存活块bitmap信息。 | 输入 |
| minimumToReadBitMapLen | 整型数 | minimumToReadBitMap数组长度。 | 输入 |
| availChunksBitMapLen | 整型数 | availChunksBitMap数组长度。 | 输入 |
| ret | 整型数 | 返回0表示成功，其他则表示失败。 | 输出 |


#### 数据结构


**表1 struct HecParam**

| 成员名 | 类型 | 描述 |
| --- | --- | --- |
| dataNum | 整型数 | 数据块个数。 |
| parityNum | 整型数 | 校验块个数。 |
| sectorSize | 整型数 | 扇区大小，最小编解码粒度，当前支持64byte和4096byte粒度。 |
| blockSize | 整型数 | 数据块或者校验块的大小，须为sectorSize的整数倍。 |
| targetColNum | 整型数 | 损失块的个数，解码接口使用。 |
| targetColArray[6] | 整型数 | 损失块列表，各个元素取值范围为[0, dataNum + parityNum)。 |
| version | 整型数 | 算法版本号，默认值为1。 版本号为0：支持扇区大小为64byte的整数倍（2≤数据块个数≤25，1≤校验块个数≤4）。 版本号为1：支持扇区大小为4096byte的整数倍（2≤数据块个数≤25，1≤校验块个数≤4）。 版本号为2：支持扇区大小为64byte的整数倍（仅支持6+3配比）。 |


**表2 struct LrcParam**

| 成员名 | 类型 | 描述 |
| --- | --- | --- |
| dataNum | 整型数 | 数据块个数。 |
| localParityNum | 整型数 | 局部校验块个数。 |
| globalParityNum | 整型数 | 全局校验块个数。 |
| sectorSize | 整型数 | 扇区大小，最小编解码粒度，当前支持64byte和4096byte粒度。 |
| blockSize | 整型数 | 数据块或者校验块的大小，须为sectorSize的整数倍。 |
| targetColNum | 整型数 | 损失块的个数，解码接口使用。 |
| targetColArray[6] | 整型数 | 损失块列表，各个元素取值范围为[0, dataNum + parityNum)。 |
| version | 整型数 | 算法版本号，默认值为1。 版本号为0：支持扇区大小为64byte的整数倍。 版本号为1：支持扇区大小为4096byte的整数倍。 |


struct HecParam支持28+3以外配比，struct LrcParam仅支持28+3配比。


#### 使用依赖

ksal/ksal_erasure_code.h


#### 使用实例

- EC编解码接口（28+3之外配比）

1. 编写EC测试代码。

  a. 新建“test.c”文件。
    1 vi test.c

  b. 按“i”键进入编辑模式，添加如下测试代码。
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ksal/ksal_erasure_code.h> int main(int argc, char **argv) { struct HecParam param = {4, 2, 4096, 8192, 2, {3, 4}}; uint8_t tmp[20][8192]; uint8_t *ptrs[20]; uint8_t *bptrs[20]; for (size_t i = 0; i < param.dataNum + param.parityNum; ++i) { for (size_t j = 0; j < param.blockSize; j++) { tmp[i][j] = (uint8_t)rand() & 0xff; } ptrs[i] = tmp[i]; bptrs[i] = tmp[i]; } KsalEcEncode(ptrs, ptrs + param.dataNum, &param); bptrs[3] = tmp[18]; bptrs[4] = tmp[19]; KsalEcDecode(bptrs, bptrs + param.dataNum, &param); if (memcmp(bptrs[3], ptrs[3], param.blockSize) == 0 && memcmp(bptrs[4], ptrs[4], param.blockSize) == 0) { printf("decode succ!!\r\n"); } else { printf("decode fail!!\r\n"); } return 0; }

  c. 按“Esc”键退出编辑模式，输入:wq!并按“Enter”键保存退出文件。
2. 编译“test.c”文件，生成test可执行文件。
  1 gcc test.c -lksal -o test

3. 运行test可执行文件。
  1 ./test

  执行输出如下。 1 decode succ!!


- EC编解码接口（28+3配比）

1. 编写EC测试代码。

  a. 新建“test.c”文件。
    1 vi test.c

  b. 按“i”键进入编辑模式，添加如下测试代码。
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ksal/ksal_erasure_code.h> int main(int argc, char **argv) { struct LrcParam param = {28, 2, 1, 4096, 8192, 2, {3, 4}, 1}; uint8_t tmp[40][8192]; uint8_t *ptrs[40]; uint8_t *bptrs[40]; for (size_t i = 0; i < param.dataNum + param.localParityNum + param.globalParityNum; ++i) { for (size_t j = 0; j < param.blockSize; j++) { tmp[i][j] = (uint8_t)rand() & 0xff; } ptrs[i] = tmp[i]; bptrs[i] = tmp[i]; } KsalLrcEncode(ptrs, ptrs + param.dataNum, &param); bptrs[3] = tmp[32]; bptrs[4] = tmp[33]; KsalLrcDecode(bptrs, bptrs + param.dataNum, &param); if (memcmp(bptrs[3], ptrs[3], param.blockSize) == 0 && memcmp(bptrs[4], ptrs[4], param.blockSize) == 0) { printf("decode succ!!\r\n"); } else { printf("decode fail!!\r\n"); } return 0; }

  c. 按“Esc”键退出编辑模式，输入:wq!并按“Enter”键保存退出文件。
2. 编译“test.c”文件，生成test可执行文件。
  1 gcc test.c -lksal -o test

3. 运行test可执行文件。
  1 ./test

  执行输出如下。 1 decode succ!!


- 根据擦除块的位置选择解码位置接口（28+3配比）

1. 编写EC测试代码。

  a. 新建“test.c”文件。
    1 vi test.c

  b. 按“i”键进入编辑模式，添加如下测试代码。
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ksal/ksal_erasure_code.h> int main(int argc, char **argv) { struct LrcParam param = {28, 2, 1, 4096, 8192, 2, {3, 4}, 1}; uint8_t minimumToReadBitMapLen = 31; uint8_t availChunksBitMapLen = 31; uint8_t minimumToReadBitMap[31] = {0}; uint8_t availChunksBitMap[31] = {0}; for (size_t i = 0; i < param.dataNum + param.localParityNum + param.globalParityNum; ++i) { if (i != 3 && i != 4) { availChunksBitMap[i] = 1; } } int ret = KsalLrcMininumToDecode(minimumToReadBitMap, availChunksBitMap, &param, minimumToReadBitMapLen, availChunksBitMapLen); uint8_t targetMinimumToReadBitMap[31] = {1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; if (memcmp(targetMinimumToReadBitMap, minimumToReadBitMap, minimumToReadBitMapLen) == 0 && ret == 0) { printf("get minimumToReadBitMap succ!!\r\n"); } else { printf("get minimumToReadBitMap fail!!\r\n"); } return 0; }

  c. 按“Esc”键退出编辑模式，输入:wq!并按“Enter”键保存退出文件。
2. 编译“test.c”文件，生成test可执行文件。
  1 gcc test.c -lksal -o test

3. 运行test可执行文件。
  1 ./test

  执行输出如下。 1 get minimumToReadBitMap succ!!
