我有这个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
的推广方式有关,但我找不到确切的错误。
答案 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;将存储在内存地址的开头。