我有一个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
最佳答案
首先,澄清一下。C数组索引开始于0,而不是1,因此更准确地说,字节0是“cc>”,而字节1是“cc>”。第二,第三个字节不能包含'a'
变量,但索引2很可能是'b'
对象的开始。
不,不存在与uint64_t
等价的uint64_t
——因为与文件操作不同,对lseek
的调用必须指定起点。
在这种情况下,您最好使用memmove()
而不是memmove()
。它们之间的唯一区别是memcpy()
正确处理重叠缓冲区。因为源和目标是不同的对象,所以不必担心。它不会显著影响代码的速度,但是任何阅读它的人都不必怀疑为什么选择使用memmove()
。
鉴于:
unsigned char buf[SOME_SIZE];
uint64_t target;
你可以这样做:
memcpy(&target, buf+2, sizeof target);
注意,我使用的是
memmove()
而不是memmove()
。两者都可以工作,但是使用sizeof target
会使代码更具弹性(以后更改代码时不易出错)。如果决定更改sizeof (uint64_t)
的类型,则不需要记住在sizeof target
调用中更改类型。关于c - 是否有一个“吸引人”的内存?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9626948/