我的内存中有一个数组,其中包含描述汇编指令的某些十六进制值。例如:
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 | jump 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;
}
关于C 中多个十六进制值的串联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43149569/