C 中多个十六进制值的串联

标签 c assembly hex concatenation

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

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/

相关文章:

c++ - 适用于 Windows 的 Memcached 客户端库

c - 我该如何更改Graph结构(插入速度非常慢)?

c - 为什么 a*b/c 而不是 a*(b/c) 在 AVR 上提供 3 倍大的程序大小?

javascript - bytes32 到 javascript 中的字符串

PHP 从 mysql 回显十六进制

java - ASCII 到 Hex-Java

C 不会将数据放在变量数组中

c - 我是否使用循环来迭代小尺寸数组(例如 2 或 3)?

c - GDB:汇编指令计算

assembly - 寄存器的十六进制值? x86