我在内存中有一个数组,其中包含某些描述汇编指令的十六进制值。例如:
708877665544332211 = jump 0x1122334455667788
70
表示汇编中的跳转,以下十六进制数字是我需要连接的内容。我已经尝试过了address |= memory[1];
address |= memory[2]<<8;
address |= memory[3]<<16;
address |= memory[4]<<24;
address |= memory[5]<<32;
address |= memory[6]<<40;
address |= memory[7]<<48;
address |= memory[8]<<56;
输出的字符串是:
0x100:708877665544332211 |跳1432778700
串联时我哪里出错了?
编辑:根据本杰明的建议,我将其更改为:
使用打印语句
printf("APPEND: %016llx", address)
进行调试时,我发现uint64_t
被更改为:APPEND: 0000000000002211
APPEND: 0000000000332211
APPEND: 0000000044332211
APPEND: 0000000044332255
APPEND: 0000000044336655
APPEND: 0000000044776655
如果地址是64位整数,为什么它似乎表现为32位整数?
最佳答案
十六进制的1432778700小数为0x556677CC。这很可能与变量“地址”的数据类型有关。它必须能够容纳8个字节。因此,您将必须使用unsigned long long int
之类的数据类型。
解决该问题后,您需要知道该地址是以小字节序还是大字节序存储在内存中的,并进行相应的处理。
更新:
刚看到您编辑的问题。
如果您期望进行以下转换:
708877665544332211成0x1122334455667788
那么即使像这样的东西也会起作用:
unsigned char bMemory[] = {0x70,0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11};
int main()
{
unsigned long long int address = *((unsigned long long int *)(&bMemory[1]));
printf("\n Address is %llX", address );
return 0;
}