当前位置: 首页 > news >正文

vFile文件的精读

typedef struct
{uint8_t *curptr;uint32_t offset;uint32_t size;
}vFile;

作用
定义了一个虚拟文件结构体 vFile,用于在内存中模拟文件操作。

  • curptr:指向数据的起始地址(内存中的“文件内容”)。
  • offset:当前读写位置(偏移量)。
  • size:文件总大小(字节数)。
void *vmalloc(size_t size)
{if (bs_user_func.bs_malloc == NULL){return NULL;}return bs_user_func.bs_malloc((size_t)size);
}

作用

  • 封装了内存分配操作。
  • 如果用户没有提供分配函数(bs_malloc),返回 NULL
  • 否则调用用户自定义的分配函数分配指定大小的内存。

这里就会和函数指针类型定义联系起来

void vfree(void *ptr)
{if (bs_user_func.bs_free == NULL){return;}bs_user_func.bs_free(ptr);
}

作用

  • 封装了内存释放操作。
  • 如果用户没有提供释放函数(bs_free),什么也不做。
  • 否则调用用户自定义的释放函数释放内存。
vFile *vfopen(const uint8_t *dp, uint32_t size)
{vFile *fp = NULL;fp = vmalloc(sizeof(vFile));if (fp != NULL){fp->curptr = (uint8_t *)dp;fp->offset = 0;fp->size = size;}return (fp);
}

作用

  • 这是“打开虚拟文件”的函数。
  • 分配一个 vFile 结构体,并初始化:
    • curptr 指向数据的起始地址(把内存当作文件内容)。
    • offset 置为0,表示文件指针在开头。
    • size 记录数据总长度。
  • 返回新建的虚拟文件指针。
int vfread(vFile *fp, uint8_t *buff, int len)
{if (fp != NULL){if ((fp->offset + len) > fp->size){len = fp->size - fp->offset;}memcpy(buff, fp->curptr + fp->offset, len);fp->offset += len;return (len);}return (0);
}

作用

  • 从虚拟文件当前偏移处读取 len 字节到 buff
  • 如果请求读取超出文件末尾,只读取剩余部分。
  • 读取后自动更新文件偏移。
  • 返回实际读取的字节数,若文件指针无效则返回0。

假设当前文件总大小为 fp->size,当前偏移为 fp->offset,你请求读取 len 字节。

如果直接 len = fp->size,那么你会从当前位置把整个文件内容都读一遍,这显然不对,因为你可能已经读到文件中间了。

正确做法是:

  • 只允许读取当前位置到文件末尾的剩余部分,也就是 fp->size - fp->offset 字节。
  • 如果请求的 len 比剩余的还多,就把 len 改成剩余的长度。

举例说明:

  • 文件总长 100 字节,当前偏移 80,你请求读 30 字节。
  • 剩余可读 = 100 - 80 = 20 字节。
  • 只能读 20 字节,不能读 100 字节(否则会越界)。

所以,

if ((fp->offset + len) > fp->size){len = fp->size - fp->offset;}

这样写是为了防止越界,只读取剩余部分,保证安全。

uint8_t *vfgetpos(vFile *fp, uint32_t *position)
{if (fp != NULL){*position = fp->offset;return (fp->curptr + fp->offset);}return (NULL);
}

作用

  • 获取当前文件偏移(offset),并返回当前位置的数据指针。
  • 如果文件指针无效,返回NULL。
int vfsetpos(vFile *fp, uint32_t position)
{if (fp != NULL){fp->offset = position;return (fp->offset);}return -1;
}

作用

  • 设置文件偏移(类似于fseek),让下次读写从新位置开始。
  • 返回设置后的偏移值,若文件指针无效返回-1。
int vfclose(vFile *fp)
{if (fp != NULL){vfree(fp);}return (0);
}

作用

  • 关闭虚拟文件,释放结构体内存。
  • 总是返回0。
uint32_t vfgetlen(vFile *fp)
{return (fp->size);
}

作用

  • 返回虚拟文件的总长度(字节数)。

相关文章:

  • 酷柚易汛ERP仓储物流解决方案
  • 怎样把B站的视频保存到本地
  • NodeRAG: 基于异构节点的基于图的RAG结构
  • 红黑树简单模拟实现
  • 复杂度讲解
  • 金融科技应用:基于XGBoost与SHAP的信用评分模型构建全流程解析
  • 【项目需求分析文档】:在线音乐播放器(Online-Music)
  • 串扰与反射对信号完整性的影响
  • 大数据治理:理论、实践与未来展望(二)
  • QWidget类关系图
  • 地理特征类相关可视化图像总结
  • Windows逆向工程提升之IMAGE_RESOURCE_DIRECTORY
  • Java 垃圾回收
  • 光模块(Optical Module)的工作原理、技术参数、应用场景及行业趋势
  • 【MPC控制 - 从ACC到自动驾驶】2 车辆纵向动力学建模与离散化:MPC的“数字蓝图”
  • Python学习心得:代码森林的冒险
  • 【笔记】关于synchronized关键字的底层原理之我流理解(未完)
  • 2024 CKA模拟系统制作 | Step-By-Step | 4、题目搭建-权限控制RBAC
  • Netty学习专栏(三):Netty重要组件详解(Future、ByteBuf、Bootstrap)
  • FPGA高速接口 mipi lvds cameralink hdml 千兆网 sdi
  • 网站建设有多少公司/淘宝运营培训班学费大概多少
  • 软件系统网站建设/抖音seo排名系统
  • 网站建设 骏域网站建设专家/百度站长资源平台
  • 网站架构设计师简历/河北seo网络推广
  • 网站个别页面做seo/十大场景营销案例
  • 网站开发培训学院/cms自助建站系统