0

我有一个包含一些二进制数据的文件,如下所示。

aa 55 aa 55 aa 55 aa 55 aa 55 aa 55 aa 55 aa 55         
aa 55 aa 55 36 65 fb 5f 1e 92 d8 1b 55 f7 fb 5f         
1e 92 d8 1b

我想提取值55 36 65 fb 5f 1e

如果我使用以下代码。

temp_1 = (data_ptr[offset]);
val = temp_1 << 40;

temp_1 = (data_ptr[offset + 1]);
val |= temp_1 << 32;

temp_1 = (data_ptr[offset + 2]);
val |= temp_1 << 24;

temp_1 = (data_ptr[ts_offset + 3]);
val |= temp_1 << 16;

temp_1 = (data_ptr[ts_offset + 4]);
val |= temp_1 << 8;

temp_1 = (data_ptr[ts_offset + 5]);
val |= temp << 0;

printf("read value %"PRIx64" \n",val);

这个 printf 的输出是

3665fb5f1e92

现在我还尝试使用单个 64 位 ptr cast 操作来计算相同的值。

val = *(uint64_t*)(data_ptr + ts_offset);
printf("read value %"PRIx64" \n",val);

上面代码的输出是

1bd8921e5ffb6536 

如果您在此处检查最低有效 48 位921e5ffb6536

与第一个结果相比,它是倒置的。我使用的是普通的英特尔处理器。为什么会出现这种情况?这是预期的吗。

4

2 回答 2

2

在移动值的代码中,您正在从最低地址读取最高字节(偏移量 0 的第 40-47 位)。我猜你的第二种情况是在 x86 机器上运行,因此从最低地址读取最低字节(因为这就是 x86 的定义方式,与许多其他处理器一样,它们被称为“小端”机器)。

如果您想要特定顺序的字节,在小端机器上,您将不得不一个一个地获取字节并移位(如果您想要一个完整的 64 位值,可能已经可以使用字节交换指令x86,但我怀疑它是否足够有价值,因为当您需要通过移动和屏蔽您实际上不需要的 16 位来“撤消”它时)。

于 2013-08-28T22:31:35.573 回答
1

该行为是预期的。

整数的字节顺序保存在内存中是不同的。从最低有效字节到最高(小端)或最高有效字节到最低。(大端)。

谷歌“endian”获取大量信息或阅读“Guliver Travel”。

于 2013-08-28T22:33:38.127 回答