Как извлечь элементы многобайтового массива как единое число?
Добрый день.
Есть динамический массив из 9 эелементов типа char. Нулевой элемент - служебный, а элементы с 1 по 8 представляют сообй единое число типа unsigned long long. Могу ли я как-то преобразовать указатель на 1 элемент массива в указатель на ULL, чтобы извлечь следующие 8 байт как число ULL?
Лучше так делать не надо. Это UB - нарушение всяких strict aliasing, выравниваия и вообще от порядка байт в машине зависит. Лучше руками собрать ULL по частям, вроде
for (int i = 0; i < 8; ++i) result |= byte_array[i+1] << (8ULL*i);
или
for (int i = 0; i < 8; ++i) result |= byte_array[i+1] << (8ULL*(7-i));
На худой конец, если очень узкое место, надо делать memcpy из массива в &result.
Adamos, Помимо выравнивания, дело еще в strict aliasing. Ну вот нельзя обращаться к данным по указателю не того типа (за редкими исключениями, которые тут не применимы). Компилятор может там всякого наворотить. Это UB.
hasound, Так уже нет проблем с aliasing и выравниванием. Можно обращаться к long long по char* (но нельзя наоборот!). Но лучше memcpy(&id, buffer, sizeof(id));.