我有一个包含 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
对象的开始。
不,没有与 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()
调用中更改类型。
关于c - 是否有 "lseek"要内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9626948/