Во-первых, немного разъяснений. Индексирование массива C начинается с 0, а не 1, поэтому более точно сказать, что байт 0 равен 'a'
, а байт 1 равен 'b'
. Во-вторых, ваш третий байт не может содержать переменную uint64_t
, но индекс 2 может быть , начинающийся объекта uint64_t
.
Нет, нет lseek
эквивалент для memmove()
- так как в отличие от операций с файлами, вызов memmove()
должен указать начальную точку.
И в этом случае вы также можете использовать memcpy()
, а не memmove()
. Единственное различие между ними заключается в том, что memmove()
правильно обрабатывает перекрывающиеся буферы. Поскольку ваш источник и цель - разные объекты, это не проблема. Это не повлияет на скорость вашего кода, но кто-то, кто его читает, не будет задаваться вопросом, почему вы решили использовать memmove()
.
Дано:
unsigned char buf[SOME_SIZE];
uint64_t target;
вы можете сделать что-то вроде этого:
memcpy(&target, buf+2, sizeof target);
Обратите внимание, что я использовал sizeof target
, а не sizeof (uint64_t)
. Любой из них будет работать, но использование sizeof target
делает ваш код более устойчивым (менее уязвим к ошибкам, так как впоследствии вы его изменяете). Если вы решите изменить тип target
, вам не нужно помнить об изменении типа в вызове memcpy()
.
Является ли указатель математикой и кастинг слишком сложно для вас? –