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、KsalLrcMininumToDecode仅支持28+3配比
参数释义
参数名 |
类型 |
描述 |
输入/输出 |
---|---|---|---|
data |
指针数组 |
数据块指针数组。 |
输入/输出 |
parity |
指针数组 |
校验块指针数组。 |
输入/输出 |
param |
编解码参数指针 |
编解码参数。 |
输入 |
minimumToReadBitMap |
指针数组 |
最少需要读的块的bitmap信息。 |
输入/输出 |
availChunksBitMap |
指针数组 |
存活块bitmap信息。 |
输入 |
minimumToReadBitMapLen |
整型数 |
minimumToReadBitMap数组长度。 |
输入 |
availChunksBitMapLen |
整型数 |
availChunksBitMap数组长度。 |
输入 |
ret |
整型数 |
返回0表示成功,其他则表示失败。 |
输出 |
数据结构
成员名 |
类型 |
描述 |
---|---|---|
dataNum |
整型数 |
数据块个数。 |
parityNum |
整型数 |
校验块个数。 |
sectorSize |
整型数 |
扇区大小,最小编解码粒度,当前支持64Byte和4096Byte粒度。 |
blockSize |
整型数 |
数据块或者校验块的大小,须为sectorSize的整数倍。 |
targetColNum |
整型数 |
损失块的个数,解码接口使用。 |
targetColArray[6] |
整型数 |
损失块列表,各个元素取值范围为[0, dataNum + parityNum)。 |
version |
整型数 |
算法版本号,默认值为1。
|
成员名 |
类型 |
描述 |
---|---|---|
dataNum |
整型数 |
数据块个数。 |
localParityNum |
整型数 |
局部校验块个数。 |
globalParityNum |
整型数 |
全局校验块个数。 |
sectorSize |
整型数 |
扇区大小,最小编解码粒度,当前支持64Byte和4096Byte粒度。 |
blockSize |
整型数 |
数据块或者校验块的大小,须为sectorSize的整数倍。 |
targetColNum |
整型数 |
损失块的个数,解码接口使用。 |
targetColArray[6] |
整型数 |
损失块列表,各个元素取值范围为[0, dataNum + parityNum)。 |
version |
整型数 |
算法版本号,默认值为1。 版本号为0:支持扇区大小为64Byte的整数倍。 版本号为1:支持扇区大小为4096Byte的整数倍。 |
使用依赖
ksal/ksal_erasure_code.h
使用实例
- EC编解码接口(28+3之外配比)
- 编写EC测试代码。
- 新建“test.c”文件。
vi test.c
- 按“i”键进入编辑模式,添加如下测试代码。
#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, ¶m); bptrs[3] = tmp[18]; bptrs[4] = tmp[19]; KsalEcDecode(bptrs, bptrs + param.dataNum, ¶m); 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; }
- 按“Esc”键退出编辑模式,输入:wq!并按“Enter”键保存退出文件。
- 新建“test.c”文件。
- 编译“test.c”文件,生成test可执行文件。
gcc test.c -lksal -o test
- 运行test可执行文件。
./test
执行输出如下。decode succ!!
- EC编解码接口(28+3配比)
- 编写EC测试代码。
- 新建“test.c”文件。
vi test.c
- 按“i”键进入编辑模式,添加如下测试代码。
#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, ¶m); bptrs[3] = tmp[32]; bptrs[4] = tmp[33]; KsalLrcDecode(bptrs, bptrs + param.dataNum, ¶m); 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; }
- 按“Esc”键退出编辑模式,输入:wq!并按“Enter”键保存退出文件。
- 新建“test.c”文件。
- 编译“test.c”文件,生成test可执行文件。
gcc test.c -lksal -o test
- 运行test可执行文件。
./test
执行输出如下。decode succ!!
- 根据擦除块的位置选择解码位置接口(28+3配比)
- 编写EC测试代码。
- 新建“test.c”文件。
vi test.c
- 按“i”键进入编辑模式,添加如下测试代码。
#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, ¶m, 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; }
- 按“Esc”键退出编辑模式,输入:wq!并按“Enter”键保存退出文件。
- 新建“test.c”文件。
- 编译“test.c”文件,生成test可执行文件。
gcc test.c -lksal -o test
- 运行test可执行文件。
./test
执行输出如下。get minimumToReadBitMap succ!!