2012-03-08 3 views
0

У меня есть буфер с n байтами, но я хочу читать только в байтах sizeof (something) из байта 3, то есть я не хочу читать в байтах 1 и 2 из буфера. Например ...Есть ли «lseek» для memmove?

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

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

Является ли указатель математикой и кастинг слишком сложно для вас? –

ответ

2

Во-первых, немного разъяснений. Индексирование массива 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().

0

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

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

Потому что он может выйти из строя, если этот адрес смещен. –

+0

Справа. Хорошо, тогда вам лучше использовать «memcpy», но я вижу, что вы уже сделали хороший ответ, объяснив это :) – xato

 Смежные вопросы

  • Нет связанных вопросов^_^