我在内存中有一个数组,其中包含某些描述汇编指令的十六进制值。例如:

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小数为0x‭556677CC‬。这很可能与变量“地址”的数据类型有关。它必须能够容纳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;
}

10-04 23:22