2013-08-28 63 views
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的outupt是

3665fb5f1e92 

现在我也尝试计算使用一个64位PTR转换操作相同的值。

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

上述代码的输出是

1bd8921e5ffb6536 

如果您在此处检查至少显著48位921e5ffb6536

它是相对于第一result.I正在使用倒置正常的英特尔处理器。为什么是这种行为?这是预期的。

+1

你知道什么[字节序(http://en.wikipedia.org/wiki/Endianness)是什么?看看这个网站。有几十个相关的问题(比如[this one])(http://stackoverflow.com/questions/17423967/char-pointer-returns-unexpected-value-after-being-cast-from-int) – WhozCraig

+0

Intel ==小端。 –

回答

2

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

如果你想在特定的顺序中的字节,在一个小端机器上,你将不得不一个一个字节地移动(如果你想要一个完整的64位值,它可能已经可以使用在x86上是一个byteswap指令,但是我怀疑它的价值在于当你需要通过移动和掩盖你实际上并不需要的16位来“撤销”)。

1

行为的预期。

的整数的字节顺序被保存在存储器而变化。从最低有效字节到最多(小端)或最高有效字节到最少。 (Big endian)。

谷歌“端”为吨的信息,或是读“Guliver旅游的”。