schifra库上的RS代码 - 如何设置综合
RS-Code on schifra library - how set up polynommial?
我当前正在尝试使Schifra库运行以进行一些测试以稍后在我的代码中实现。
我目前正在查看schifra_reed_solomon_example02.cpp,并尝试了解我必须设置值以适合我的需求。
/* Finite Field Parameters */
const std::size_t field_descriptor = 8; // GF(2^8) ok
const std::size_t generator_polynommial_index = 120; // what is this?
const std::size_t generator_polynommial_root_count = 32; // polynomial up to x^32
/* Reed Solomon Code Parameters */
const std::size_t code_length = 255; // amount of symbols in codeword
const std::size_t fec_length = 32; // minimal distance d ?
const std::size_t data_length = code_length - fec_length; // amount of symbols my message has
所以我试图拥有的是n,k,d =(128,16,113)
的RS代码我将继续以下内容:
/* Finite Field Parameters */
const std::size_t field_descriptor = 8; // I want GF(2^8)
const std::size_t generator_polynommial_index = 120; // still not knowing
const std::size_t generator_polynommial_root_count = 16; // because polynomial up to 16
/* Reed Solomon Code Parameters */
const std::size_t code_length = 128; // 128 byte codewords
const std::size_t fec_length = 113; // minimal distance, 113 because d = n - k +1
const std::size_t data_length = 16;
i然后在编码mesage时收到错误。
schifra::galois::field_polynomial generator_polynomial(field);
schifra::sequential_root_generator_polynomial_creator(field,
generator_polynommial_index,
generator_polynommial_root_count,
generator_polynomial);
/* Instantiate Encoder and Decoder (Codec) */
schifra::reed_solomon::encoder<code_length,fec_length> encoder(field,generator_polynomial);
schifra::reed_solomon::decoder<code_length,fec_length> decoder(field,generator_polynommial_index);
std::string message = "A professional i"; // its 16 bytes
std::cout << "Original Message: [" << message << "]" << std::endl;
message = message + std::string(data_length - message.length(),static_cast<unsigned char>(0x00)); // this one is also done in example
std::cout << "Original Message: [" << message << "]" << std::endl;
std::cout << "Message length: " << message.length() << std::endl; // still 16 bytes
/* Instantiate RS Block For Codec */
schifra::reed_solomon::block<code_length,fec_length> block;
/* Transform message into Reed-Solomon encoded codeword */
if (!encoder.encode(message,block))
{
std::cout << "Error - Critical encoding failure!" << std::endl;
return 1;
}
然后给出Error - Critical encoding failure!
。
我认为我做错了什么是设置polynommial-也许有人可以帮助我?
我是一个初学者,试图使用Schifra图书馆。我对芦苇所罗门代码一无所知,经过数周的挖掘源代码,我发现了一种总是有效的组合。我仍然不知道RS代码使用的任何数学。
一些可能有用的行话:
- 符号:RS代码将识别的最小量化信息(通常设置为8位(1个字节))
- fec:是冗余或误差校正"符号",这些符号是在数据末尾附加的
- 数据:您要生成的RS代码的数据。
- Galois字段:REED所罗门代码用于进行错误校正的多项式或映射(我不知道RS代码后面有任何数学)
有效的组合并从初始化变量中有意义,而无需深入研究数学:
- 字段描述符=符号的大小(通常设置为8位长度)
- 发电机多项式索引=不知道这是什么,但是将其设置为0总是有效的,并且与其他值相比给出了较小的性能提升。
- 发电机多项式根数=需要等于FEC长度
- 代码长度=此值必须为(2^(符号大小或字段描述符)-1)。它表示您的最终编码字符串(数据符号 错误corr符号)的符号数。请注意,位的编码字符串的总大小等于代码长度*符号大小。
- FEC长度:错误校正符号的数量。
- 数据长度:数据符号的数量。(在示例中以Code_length -fec_length的形式发起)不应触摸。
应该注意的是,对于特定符号大小,代码长度是固定的,并且可以改变代码长度的百分比是数据,什么是错误校正符号。正如常识所建议的那样,更多的错误校正符号会导致更多的错误校正能力。
运行编码器时,您将块对象与数据一起传递。
在运行方法coder.encode时,用编码的数据(数据 ECC)填充了"块"。
腐败后,解码完成。在此链接中解释了错误的误差数量,可以通过解码器校正的擦除
中解释解码器将块和擦除列表(如果适用)作为参数,并返回原始消息/数据,如果擦除和错误的数量在ECC的范围内(查看链接)。
。reed-solomon编码并不是要与
一起使用您的参数,独立于程序代码。
您可以选择以下内容:
- a
B
,那就是一个数据单元具有多少(例如,对于正常字节数据,b = 8)。 - 具有
0 <= T < (2^b)/3
的T
:较大的TS表示更好的误差校正,但编码速度较小。 - 一些不可约的多项式和基本力量,在这里并不重要。
您无法选择:
- GF/多项式基础是
2^B
,别无其他。 - 每个明文块(没有RS校验和数据)必须为
(2^B - 2*T - 1)
数据单元(此处字节),别无其他。 - 对于每个明文块,RS将进一步计算
2*T
数据单元校验和数据。 - 因此,一个具有明文和校验和数据的块一起具有
2^B -1
数据单元。
这意味着,以字节为数据单元,这样的块完全具有255个字节,仅此而已。 - 再次解码时,可以纠正
T
错误的数据单元
(错误可能是按照明文和/或校验和零件的,没关系) - 可以识别出
2*T
错误的数据单元,但必须纠正。 - 除了
2*T
错误之外,所有赌注都关闭了。
在示例代码(部分)中:
const std::size_t field_descriptor = 8;
const std::size_t code_length = 255;
const std::size_t fec_length = 32;
const std::size_t data_length = code_length - fec_length;
- field_descriptor是B。
- code_length是一个完整的块长度(明文 校验和)。
- fec_length是校验和长度。
- data_length是明文块长度。
因此,对于每233个明文字节,RS计算32个校验和字节
(= 255个字节),以后能够纠正多达16个错误的字节。
在代码中,您选择gf(2^8)和字节数据,因此b = 8,因此code_length 128是错误的。它必须是255。校验和零件长度113太多,甚至不是,而明文长度不是以前的值的差异。
...
除此之外,在我在互联网上知道的6个RS代码中,Shifra是迄今为止最糟糕的(尽管被称为"高度最佳",古怪的代码,有问题的许可,但非常慢,...)。选择任何东西,但不是schifra。
我会检查我是否可以分享我写的东西...包括了解算法的内部工作,编写所有内容(Engoder 解码器)甚至没有一天,而且比Schifra快3倍当时测试机器(没有ASM,只有C )。缺点是只能与基于字节的数据一起使用,即。B=8
,无法选择其他基础。但是可能无论如何您都不需要。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何在24位SDL_Surface上设置像素的颜色
- std::设置自定义比较器
- 如何设置一个范围来提取我想要获得的信息
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 通过选项卡的文本设置QTabWidget顺序
- 类中的 C++ int 被设置为值,似乎不知从何而来
- 如何使用C++在Windows7中将显示设置设置为EXTEND模式