长十六进制Linux上的按位运算C.

时间:2012-06-19 16:53:03

标签: c linux hex bit-manipulation

简要说明:问题与十六进制语言C的按位运算有关; O.S:linux

我只想对“长”十六进制字符串执行一些按位操作。 我尝试了以下方法:

首先尝试:

由于溢出,我无法使用以下内容:

long  t1 = 0xabefffcccaadddddffff;
and t2 = 0xdeeefffffccccaaadacd;

第二次尝试:不起作用,因为abcdef被解释为字符串而不是十六进制

char* t1 = "abefffcccaadddddffff";
char* t2 = "deeefffffccccaaadacd";

int len = strlen(t1);

for (int i = 0; i < len; i++ )
    {
        char exor = *(t1 + i) ^ *(t2 + i);
    printf("%x", exor);
}

有人可以告诉我怎么做吗? THX

4 个答案:

答案 0 :(得分:1)

按位操作通常很容易扩展到更大的数字。

执行此操作的最佳方法是将它们分成4或8个字节的序列,并将它们存储为uints数组。在这种情况下,这些特定字符串至少需要80位。

对于AND而言非常简单,例如:

unsigned int A[3] = { 0xabef, 0xffcccaad, 0xddddffff };
unsigned int B[3] = { 0xdeee, 0xfffffccc, 0xcaaadacd };
unsigned int R[3] = { 0 };

for (int b = 0; b < 3; b++) {
    R[b] = A[b] & B[b];
}

一个更完整的例子,包括扫描十六进制字符串并打印它们:

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

typedef unsigned int uint;

void long_Print(int size, const uint a[]) {
    printf("0x");
    for (int i = 0; i < size; i++) {
        printf("%x", a[i]);
    }
}

void long_AND(int size, const uint a[], const uint b[], uint r[]) {
    for (int i = 0; i < size; i++) {
        r[i] = a[i] & b[i];
    }
}

// Reads a long hex string and fills an array. Returns the number of elements filled.
int long_Scan(int size, const char* str, uint r[]) {
    int len = strlen(str);
    int ri = size;

    for (const char* here = &str[len]; here != str; here -= 8) {
        if (here < str) {
            char* tmp = (char*)malloc(4);

            tmp[0] = '%';
            tmp[1] = (char)(str - here + '0');
            tmp[2] = 'x';
            tmp[3] = '\0';

            sscanf(str, tmp, &r[ri--]);

            free(tmp);

            break;
        }
        else {
            sscanf(here, "%8x", &r[ri--]);
        }
    }

    for (; ri >= 0; ri--) {
        r[ri] == 0;
    }

    return size - ri;
}

int main(int argc, char* argv[])
{
    uint A[3] = { 0 };
    uint B[3] = { 0 };
    uint R[3] = { 0 };

    long_Scan(3, "abefffcccaadddddffff", A);
    long_Scan(3, "deeefffffccccaaadacd", B);

    long_Print(3, A);
    puts("\nAND");
    long_Print(3, B);
    puts("\n=");

    long_AND(3, A, B, R);
    long_Print(3, R);

    getchar();

    return 0;
}

答案 1 :(得分:0)

你肯定需要使用一个可以处理任意长整数的库。考虑使用libgmp:http://gmplib.org/

答案 2 :(得分:0)

在进行任何类型的按位操作之前,您需要使用整数。 "abeffccc" 不是整数。这是一个字符串。您需要使用strtol之类的内容 首先将字符串转换为整数。

如果您的值太大而无法容纳到64位long long int(0xFFFFFFFF,FFFFFFFF),那么您将需要使用Big Integer库或类似的东西来支持任意大的值。正如提到的H2CO3,libgmp是C中大数字的最佳选择。

答案 3 :(得分:0)

您可以尝试使用unsigned long数组,而不是直接使用unsigned int。每个unsigned int保存32位或8个十六进制数字。因此,您必须将常量切换为每个8个十六进制数字的块:

unsigned int t1[3] = { 0xabef , 0xffcccaad , 0xddddffff };

请注意,为了理智,您应该以相反的顺序存储它们,以便t1的第一个条目包含最低位。