记忆中是否有“lseek”?

时间:2012-03-08 23:57:35

标签: c linux unix memcpy memmove

我有一个n字节的缓冲区,但我只想从字节3读取sizeof(某事物)字节,这意味着我不想从缓冲区读取字节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 个答案:

答案 0 :(得分: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()来电中的类型。

答案 1 :(得分:0)

为什么不简单地使用它:

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