В настоящее время я пытаюсь запустить библиотеку 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!
затем дается.
Я думаю, что я делаю неправильно, настраивая правильный полином — возможно, кто-то может мне помочь?
Кодировка Рида-Соломона не предназначена для работы с
ваши параметры, независимо от кода программы.
Вы можете выбрать следующие вещи:
B
это то, сколько бит имеет один элемент данных (например, B = 8 для обычных байтовых данных). T
с 0 <= T < (2^b)/3
: Большие Ts означают лучшую коррекцию ошибок, но меньшую скорость кодирования. Вы не можете выбрать:
2^B
, ничего больше. (2^B - 2*T - 1)
блоки данных (здесь байты), ничего больше. 2*T
данные контрольной суммы блоков данных. 2^B -1
блоки данных.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;
Таким образом, для каждого 233 байта открытого текста RS вычисляет 32 байта контрольной суммы
(= 255 байт), чтобы позже можно было исправить до 16 неправильных байтов.
В вашем коде вы выбираете GF (2 ^ 8) и байтовые данные, поэтому B = 8, поэтому кодовая длина 128 неверна. Должно быть 255. Длина 113 части контрольной суммы слишком велика и неравномерна, а длина открытого текста не отличается от предыдущих значений.
…
Помимо этого, из 6 кодов RS, которые я знаю в интернете, Shifra является наихудшим (очень медленным, несмотря на то, что его хвалят как «высокооптимизированный», причудливый код, проблемная лицензия, …). Выбирай что угодно, но только не Шифру.
Я проверю, могу ли я поделиться чем-то, что я написал … Включая изучение внутренней работы алгоритма, написание всего (кодер + декодер) заняло даже не дня, и это было в 3 раза быстрее, чем Schifra на тестовой машине назад затем (без асм, просто C ++). Недостатком является то, что он может работать только с байтовыми данными, т.е. B=8
без возможности выбора других баз. Но, вероятно, вам все равно это не нужно.
Других решений пока нет …