我有一个 n 字节的缓冲区,但我只想从字节 3 中读取 sizeof(something) 字节,这意味着我不想从缓冲区中读取字节 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
首先,稍微澄清一下。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()
调用中的类型。
为什么不简单地使用这个:
uint64_t num;
num = * ((uint64_t *) (buffer + 2))