2013-08-28 2 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); 

outupt этого Printf является

3665fb5f1e92 

Теперь я также попытаться вычислить то же значение, с использованием одного 64-битной операции PTR литой.

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

Выход выше код

1bd8921e5ffb6536 

Если вы проверяете младшие 48 бита здесь 921e5ffb6536

Это перевернутая по сравнению с первым result.I я с помощью нормальный процессор intel. Почему такое поведение? Ожидается.

+1

Знаете ли вы, что [Endianness] (http://en.wikipedia.org/wiki/Endianness) есть? Осмотритесь на этом сайте. есть * десятки * связанных с ним вопросов (таких как [этот] (http://stackoverflow.com/questions/17423967/char-pointer-returns-unexpected-value-after-being-cast-from-int) . – WhozCraig

+0

Intel == little endian. –

ответ

2

В вашем коде, который сдвигает значение, вы читаете наивысший байт с младшего адреса (бит 40-47 из смещения 0). Я предполагаю, что ваш второй случай запущен на машине x86, таким образом, считывая младший байт с самого низкого адреса (потому что именно так определяется x86, так как это МНОГИЕ другие процессоры, они называются «малопоточными» машинами).

Если вы хотите, чтобы байты в этом конкретном порядке, на машине с маленькими концами, вам нужно будет получать байты один за другим и сдвигать (если вы хотите получить все 64-битное значение, возможно, было возможно использовать инструкция byteswap на x86, но я сомневаюсь, что этого достаточно, потому что тогда вам нужно «отменить», что, переместив и замаскировав 16 бит, вам действительно не понадобилось).

1

Поведение ожидается.

Порядок байтов целого числа сохраняется в памяти. От наименее значимого байта к большинству (младший конечный) или самый старший байт по меньшей мере. (Большой эндиан).

Google «endian» для тонны информации или читайте «Guliver Travel».

Смежные вопросы