比较uint64_t和unsigned char *

时间:2015-01-25 19:14:40

标签: c

我有这个POC

#include <stdio.h>
#include <stdint.h>

int main(void) {
    unsigned char *c = "This is ";
    uint64_t i;
    int j;
    i = c[7] | (c[6] << 8) | (c[5] << 16) | (c[4] << 24) | (c[3] << 32) | (c[2] << 40) | (c[1] << 48) | (c[0] << 56);
    printf("c value: '%s'\n", c);
    printf("Hex:");
    for (j = 0; j < 8; j++) {
        printf(" %2x", c[j]);
    }
    printf("\n");

    printf("Is i equal to c? %d\n", 
        memcmp((unsigned char *)&i, "\x54\x68\x69\x73\x20\x69\x73\x20", 8)
    );
    return 0;
}

我有一个unsigned char *(请注意最后的空格!)和一个uint64_t,我正在填写unsigned char *的数据。

然后我memcmp这两个变量,我希望获得0,但我得到-1。那是为什么?

我认为它与按位操作中c的推广方式有关,但我找不到确切的错误。

1 个答案:

答案 0 :(得分:3)

如果您使用此代码:

#include <stdio.h>
#include <stdint.h>
#include <string.h>
int main(void) {
    unsigned char *c = "This is ";
    uint64_t i;
    int j;
    i = (uint64_t ) c[7] | ((uint64_t )c[6] << 8) | ((uint64_t )c[5] << 16) | ((uint64_t )c[4] << 24) | ((uint64_t )c[3] << 32) | ((uint64_t )c[2] << 40) | ((uint64_t )c[1] << 48) | ((uint64_t )c[0] << 56);
    printf("c value: '%s'\n", c);
    printf("Hex:");
    for (j = 0; j < 8; j++) {
        printf(" %2x", c[j]);
    }
    printf("\n");

    printf("Printing i contents as they appear in memory \n");
    unsigned char *k=(unsigned char*)&i;
    for(int j = 0;j<8 ;j++)
        printf("%2x ",(unsigned) k[j]);
    printf("\n");

    printf("Is i is equal to c? %d\n",
           memcmp(&i, "\x54\x68\x69\x73\x20\x69\x73\x20", 8)
           );
    return 0;
}

我的机器上的小端的输出是:

    c value: 'This is '
    Hex: 54 68 69 73 20 69 73 20
    Printing i contents as they appear in memory 
    20 73 69 20 73 69 68 54 

存储在内存中时,您可以看到字节相反。这应该可以为您提供线索,如果您的PC是小端,i的最低有效字节是&#39; &#39;将存储在内存地址的开头。