Сначала немного уточнений. Индексирование массива C начинается с 0, а не с 1, поэтому точнее будет сказать, что байт 0 равен 'a'
, а байт 1 - 'b'
. Во-вторых, ваш третий байт не может содержать переменную uint64_t
, но индекс 2 вполне может быть начало объекта uint64_t
.
Нет, для memmove()
нет эквивалента lseek
- потому что, в отличие от файловых операций, вызов 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()
.