RS-код на библиотеке Schifra — как настроить полиномиальный?

В настоящее время я пытаюсь запустить библиотеку 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

Так что я пытаюсь получить 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;

Я тогда получаю при кодировании сообщения ошибку.

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! затем дается.

Я думаю, что я делаю неправильно, настраивая правильный полином — возможно, кто-то может мне помочь?

5

Решение

Кодировка Рида-Соломона не предназначена для работы с
ваши параметры, независимо от кода программы.

Вы можете выбрать следующие вещи:

  • Bэто то, сколько бит имеет один элемент данных (например, B = 8 для обычных байтовых данных).
  • T с 0 <= T < (2^b)/3: Большие 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, поэтому кодовая длина 128 неверна. Должно быть 255. Длина 113 части контрольной суммы слишком велика и неравномерна, а длина открытого текста не отличается от предыдущих значений.

Помимо этого, из 6 кодов RS, которые я знаю в интернете, Shifra является наихудшим (очень медленным, несмотря на то, что его хвалят как «высокооптимизированный», причудливый код, проблемная лицензия, …). Выбирай что угодно, но только не Шифру.

Я проверю, могу ли я поделиться чем-то, что я написал … Включая изучение внутренней работы алгоритма, написание всего (кодер + декодер) заняло даже не дня, и это было в 3 раза быстрее, чем Schifra на тестовой машине назад затем (без асм, просто C ++). Недостатком является то, что он может работать только с байтовыми данными, т.е. B=8без возможности выбора других баз. Но, вероятно, вам все равно это не нужно.

-2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]