关于schifra库的RS代码 - 如何设置多项式?

Ste*_*fan 5 c++ error-correction reed-solomon

我目前正在尝试让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
Run Code Online (Sandbox Code Playgroud)

所以我试图得到的是一个RS代码,n,k,d =(128,16,113)

我将继续以下内容:

/* 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; 
Run Code Online (Sandbox Code Playgroud)

然后我在编码消息时收到错误.

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;
   }
Run Code Online (Sandbox Code Playgroud)

Error - Critical encoding failure!随后给出.

我认为我做错了是设置多项式正确 - 也许有人可以帮助我?

dev*_*fan -2

里德-所罗门编码并不意味着与
您的参数一起工作,独立于程序代码。

您可以选择以下内容:

  • A B,即一个数据单元有多少位(例如,对于普通字节数据,B=8)。
  • A Twith 0 <= T < (2^b)/3:T 越大意味着纠错能力越好,但编码速度越慢。
  • 一些不可约多项式和基幂,在这里并不重要。

您不能选择:

  • 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;  
Run Code Online (Sandbox Code Playgroud)
  • 字段描述符是 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 是迄今为止最差的(尽管被称赞为“高度优化”、古怪的代码、有问题的许可证,但速度非常慢……)。选择任何东西,但不能选择 Schfra。

我会检查是否可以分享我写的东西......包括了解算法的内部工作原理,编写所有内容(编码器+解码器)甚至不需要一天,并且在测试机上比Schifra快3倍然后(没有 asm,只有 C++)。缺点是只能处理基于字节的数据,即。B=8,而无法选择其他基地。但也许你根本不需要那个。