gpt4 book ai didi

c - 是否有 "lseek"要内存?

转载 作者:太空宇宙 更新时间:2023-11-04 09:52:16 24 4
gpt4 key购买 nike

我有一个包含 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com