0

我有一个 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
4

2 回答 2

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()调用中的类型。

于 2012-03-09T00:04:51.537 回答
0

为什么不简单地使用这个:

uint64_t num;
num = * ((uint64_t *) (buffer + 2))
于 2012-03-09T00:01:25.340 回答