У меня есть файл с некоторыми двоичными данными следующим образом.Странное поведение при использовании указателей
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. Почему такое поведение? Ожидается.
Знаете ли вы, что [Endianness] (http://en.wikipedia.org/wiki/Endianness) есть? Осмотритесь на этом сайте. есть * десятки * связанных с ним вопросов (таких как [этот] (http://stackoverflow.com/questions/17423967/char-pointer-returns-unexpected-value-after-being-cast-from-int) . – WhozCraig
Intel == little endian. –