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

标签 c linux unix memcpy memmove

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

相关文章:

linux - 在 NASM 中实现 cat>fileName 命令

linux - 在目录中用awk拆分文件夹名称

php - 重用PHP Unix套接字文件

linux - 如何确认 SFTP 文件传送?

c - 如何调试/跟踪套接字编程

C 箱号+1 : need brackets?

c++ - 带有命令行参数的 C++ Makefile 和 Bash 脚本

wcscpy_s 中的崩溃

c - 有谁知道我的 C 程序的这种奇怪输出是如何发生的?

c++ - 无法在 Ubuntu、C++ 上配置设备 ttyUSB0 (Arduino)