C/C++ 基础的二进制变化
Binary change of basis in C/C++
我正在从一个接口控制文档中实现一种解码方法,它需要改变二进制基础——这对我来说是第一次。 basis的变化如下(z是我有的,矩阵是变换,u是我需要的):
它指出:
我尝试的是将 z_n 向量乘以变换矩阵的每一列(使用和运算符)并将结果相加(使用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};
但结果与预期不符。我是否正确实施了这一基础变更?
编辑
我也有逆变换。如果实现正确,我应该可以转换一个字节,然后再转换回原来的状态。在我的实现中,反向转换产生了不同的结果:
问题已解决。验证码如下:
#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
您的语言支持向量化的双操作数 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
.
的所有内容
我正在从一个接口控制文档中实现一种解码方法,它需要改变二进制基础——这对我来说是第一次。 basis的变化如下(z是我有的,矩阵是变换,u是我需要的):
它指出:
我尝试的是将 z_n 向量乘以变换矩阵的每一列(使用和运算符)并将结果相加(使用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};
但结果与预期不符。我是否正确实施了这一基础变更?
编辑
我也有逆变换。如果实现正确,我应该可以转换一个字节,然后再转换回原来的状态。在我的实现中,反向转换产生了不同的结果:
问题已解决。验证码如下:
#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
您的语言支持向量化的双操作数 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
.