Бинарное изменение базы в C / C ++ - PullRequest
2 голосов
/ 10 марта 2020

Я реализую метод декодирования из документа управления интерфейсом, и он требует изменения базы в двоичном формате - что является первым для меня. Изменение базы выглядит следующим образом ( z - это то, что у меня есть, матрица - это преобразование, а u - это то, что мне нужно):

enter image description here

и в нем говорится:

enter image description here

Я пытался умножить z_n вектора для каждого столбца матрицы преобразования (используя оператор AND и) и добавьте результаты (с помощью оператора XOR), например:

u = (z & base[0])^(z & base[1])^(z & base[2])^(z & base[3])^(z & base[4])^(z & base[5])^(z & base[6])^(z & base[7]);

, где z - двоичный файл число для преобразования (например, 10100101 или его представление в виде 8-битного целого) и base - столбцы матрицы преобразования, представленные в виде целых чисел:

uint8_t base[8] = {155, 221, 62, 28, 55, 179, 96, 148};

Но результаты не совпадают с тем, что было должно быть. Правильно ли я реализую это изменение базы?

Edit

У меня также есть обратное преобразование. Если реализация верна, я смогу преобразовать байт, а затем преобразовать его обратно в исходное состояние. В моей реализации обратное преобразование дает другой результат:

enter image description here

Проблема решена. Вот проверочный код:

#include <math.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*Base change*/
uint8_t const matrix[] = { 0xC5, 0x42, 0x2E, 0xFD, 0xF0, 0x79, 0xAC, 0xCC }; // the rows
uint8_t const matrixinv[] = {0x8D, 0xEF, 0xEC, 0x86, 0xFA, 0x99, 0xAF, 0x7B}; // the rows

uint8_t const z = 0x64;
uint8_t u, z2;


void main(){

    printf("initial value: %d ", z);
    u = 0;
    if (z & 0x80) u ^= matrix[0];
    if (z & 0x40) u ^= matrix[1];
    if (z & 0x20) u ^= matrix[2];
    if (z & 0x10) u ^= matrix[3];
    if (z & 0x08) u ^= matrix[4];
    if (z & 0x04) u ^= matrix[5];
    if (z & 0x02) u ^= matrix[6];
    if (z & 0x01) u ^= matrix[7];

    printf(" - forward result: %d ",u);

    z2 = u;
    u = 0;
    if (z2 & 0x80) u ^= matrixinv[0];
    if (z2 & 0x40) u ^= matrixinv[1];
    if (z2 & 0x20) u ^= matrixinv[2];
    if (z2 & 0x10) u ^= matrixinv[3];
    if (z2 & 0x08) u ^= matrixinv[4];
    if (z2 & 0x04) u ^= matrixinv[5];
    if (z2 & 0x02) u ^= matrixinv[6];
    if (z2 & 0x01) u ^= matrixinv[7];

    printf("back result: %d ",u);
    getchar();
}

initial value: 100  - forward result: 21 back result: 100

1 Ответ

5 голосов
/ 10 марта 2020

Ваш язык поддерживает векторизованный XOR с двумя операндами. Он не поддерживает горизонтальное XOR (вычисление четности). Поэтому мы будем соответствующим образом структурировать наши операции.

Предполагая

uint8_t const matrix[] = { 0xC5, 0x42, 0x2E, 0xFD, 0xF0, 0x79, 0xAC, 0xCC }; // the rows
uint8_t const z;
uint8_t u;

Ваш результат будет

u = 0;
if (z & 0x80) u ^= matrix[0];
if (z & 0x40) u ^= matrix[1];
if (z & 0x20) u ^= matrix[2];
// etc following the pattern
// if ((z << i) & 0x80) u ^= matrix[i];

Обратите внимание, что я предположил, что изменение битовый порядок между входом и выходом является ошибкой. Если это правильно, вам может понадобиться отразить все содержимое matrix.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...