C / C ++中基数的二进制变化

问题描述 投票:0回答:1

我正在从接口控制文档中实现一种解码方法,它需要更改二进制的基础-这对我来说是头一个。基础的变化如下(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位int),而base是转换矩阵的以整数表示的列:

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

但是结果与预期的结果不符。我是否正确实施了这种基础变更?

编辑

我也有逆变换。如果实现正确,我应该能够转换一个字节,然后将其转换回原始状态。在我的实现中,向后转换会产生不同的结果:

enter image description here

示例代码:

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

/*Base change*/
uint8_t base[8] = {155, 221, 62, 28, 55, 179, 96, 148};
uint8_t baseinv[8] = {254, 105, 107, 13, 239, 91, 199};


void main(){
    uint8_t z, ret, new;

    z = 149;

    printf("before: ");
    printf("%d\n", z);

    printf("after: ");
    new = (z&base[0])^(z&base[1])^(z&base[2])^(z&base[3])^(z&base[4])^(z&base[5])^(z&base[6])^(z&base[7]);
    printf("%u \n",new);

    printf("returning: ");
    ret = (new&baseinv[0])^(new&baseinv[1])^(new&baseinv[2])^(new&baseinv[3])^(new&baseinv[4])^(new&baseinv[5])^(new&baseinv[6])^(new&baseinv[7]);
    printf("%u \n",ret);

    getchar();
}
c++ c binary linear-algebra bitwise-operators
1个回答
1
投票

您的语言支持向量化二操作数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的所有内容。

© www.soinside.com 2019 - 2024. All rights reserved.