【发布时间】:2013-08-28 22:13:36
【问题描述】:
我有一个包含一些二进制数据的文件,如下所示。
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
与第一个结果相比,它是倒置的。我使用的是普通的英特尔处理器。为什么会出现这种情况?这是预期的吗?
【问题讨论】:
-
你知道Endianness是什么吗?在这个网站上四处看看。有几十个与之相关的问题(例如this one.
-
英特尔 == 小端。
标签: c pointers pointer-arithmetic