Есть ли "lseek" для memmove? - PullRequest
       54

Есть ли "lseek" для memmove?

0 голосов
/ 09 марта 2012

У меня есть буфер с n байтами, но я хочу только чтение байтов размером 3 (что-то) из байта 3, то есть я не хочу читать байты 1 и 2 из буфера. Например ...

Для некоторого буфера, байт 1 = 'a', байт 2 = 'b', байт 3 = переменная uint64_t. Что я хочу сделать, это что-то вроде

1. set begin to byte 3
2. read in sizeof(uint64_t) bytes from buffer using memmove

Ответы [ 2 ]

2 голосов
/ 09 марта 2012

Сначала немного уточнений. Индексирование массива 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().

0 голосов
/ 09 марта 2012

Почему бы просто не использовать это:

uint64_t num;
num = * ((uint64_t *) (buffer + 2))
...