如何进行异或移位运算

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

我有以下异或移位编码器

char a[] = "text";
int b = strlen(a);
for (int c = 0; c < b; c++) {
    if (c > 0) a[c] ^= a[c-1];
    a[c] ^= a[c] >> 3;
    a[c] ^= a[c] >> 2;
    a[c] ^= a[c] >> 1;
    printf("%02x", (unsigned int)(a[c]));
}

我想将十六进制输出恢复为原始字符串。

甚至有可能考虑到移位在某些情况下会消除右侧不再能检索的位?如果可能的话,如何还原操作?

c xor shift
1个回答
0
投票

是的,这并不难。只需将异或结果映射回其原始值即可。考虑此功能:

char f(char c) {
    c ^= c >> 3;
    c ^= c >> 2;
    c ^= c >> 1;
    return c;
}

您应该能够使自己满意,对于每个可能的输入值(从0到127),都有一个对应的唯一输出。 (当然,如果将char更改为unsigned char,则该功能将对任何8位输入有效。)

使用此功能,您可以轻松创建一个数组来执行此功能的相反操作:

char g(char c) {
    static char *map = NULL;
    if (!map) {
        map = malloc(128);
        for (int i=0; i<128; i++) map[f(i)] = i;
    }
    return map[c];
}

然后编写一个函数以依次读取字符串的每个字符,应用此反向函数,然后将结果与前一个值进行异或:

char *decode(char *s, int len) {
    char *start = s, last = 0;
    while (len--) {
        char tmp = *s;
        *s = last ^ g(*s);
        last = tmp;
        s++;
    }
    return start;
}
© www.soinside.com 2019 - 2024. All rights reserved.