我有一个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
答案 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))