我有一个文件,如下所示的一些二进制数据。使用指针时的奇怪行为
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的outupt是
3665fb5f1e92
现在我也尝试计算使用一个64位PTR转换操作相同的值。
val = *(uint64_t*)(data_ptr + ts_offset);
printf("read value %"PRIx64" \n",val);
上述代码的输出是
1bd8921e5ffb6536
如果您在此处检查至少显著48位921e5ffb6536
它是相对于第一result.I正在使用倒置正常的英特尔处理器。为什么是这种行为?这是预期的。
你知道什么[字节序(http://en.wikipedia.org/wiki/Endianness)是什么?看看这个网站。有几十个相关的问题(比如[this one])(http://stackoverflow.com/questions/17423967/char-pointer-returns-unexpected-value-after-being-cast-from-int) – WhozCraig
Intel ==小端。 –