首页/新闻资讯/正文详情

F´ 中的 Fw::FilePacket:CFDP 风格的文件分包协议与 C++ 实现解析

发布时间:2026/9/24 16:54:03 来源:云帆数科 栏目:资讯中心
F´ 中的 Fw::FilePacket:CFDP 风格的文件分包协议与 C++ 实现解析
F´ 中的 Fw::FilePacketCFDP 风格的文件分包协议与 C 实现解析【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址: https://gitcode.com/gh_mirrors/fp/fprime导读Fw::FilePacket 是 F´F Prime飞行软件框架中用于表示“ISF 文件分组包file packet”的核心类型它定义了将任意文件切分成可在遥测/通信链路上传输的数据包的标准二进制格式。本文以 Fw/FilePacket/docs/sdd.md 设计文档为主体结合 FilePacket.hpp 及各实现文件完整讲解 START / DATA / END / CANCEL 四种包的字节布局、序列化与反序列化原理、CFDP 校验和算法并给出基于 Svc/FileDownlink 的真实调用场景帮助你直接掌握该格式的构造与解析方法。1 设计背景与 CFDP PDU 同源的包格式Fw::FilePacket 的格式设计参考了 CCSDS 文件传输协议CFDP第 5 节中定义的协议数据单元PDU结构因此它与航天工程中广泛使用的 CFDP 具有相似的骨架每个包以包类型 序号构成的头部开始头部之后是随类型而变的载荷data整个文件通过一串带序号的包顺序传输接收方可以据此重组文件并校验完整性。在 F´ 中这个类型被Svc::FileDownlink文件下传组件用来把本地文件分片发送也可被对应的上行/地面侧解析。其核心头文件为 Fw/FilePacket/FilePacket.hpp实现在 Fw/FilePacket 目录下的各.cpp文件中。2 总体结构一个包包含什么从 sdd.md 与 FilePacket.hpp 可以看出每个文件包包含以下数据字段长度说明包类型Packet type1 字节START(0)、DATA(1)、END(2)、CANCEL(3)另有内部占位T_NONE(255)序号Sequence index4 字节无符号整数每个文件从 0 开始后续每包递增 1包数据Packet data可变具体格式取决于包类型在代码层面FilePacket被实现为一个联合union内部同时包含Header、StartPacket、DataPacket、EndPacket、CancelPacket五种结构通过m_header.m_type区分当前“视图”这与 C 中“判别式联合tagged union”的经典做法一致。2.1 头部Header的序列化头部总是最先出现在每个包中其缓冲区大小固定为 5 字节sizeof(U8) sizeof(U32)见 FilePacket.hpp 中HEADERSIZE与 Header.cpp 的bufferSize()。序列化时先写类型字节强制转成U8再写 4 字节序号Header.cpp反序列化时依次读回并用static_castType还原类型Header.cpp。这一对toSerialBuffer/fromSerialBuffer是所有包类型共用的基础能力。3 四种包类型的载荷格式3.1 START 包类型 0声明文件传输开始START 包的包类型为START序号恒为0用于宣告一个新文件传输的开始。其载荷依次为字段长度说明文件大小File size4 字节整个文件的字节数U32源路径长度1 字节源路径source path的字节数U8源路径可变源端文件路径目的路径长度1 字节目的路径destination path的字节数U8目的路径可变目标端文件路径对应实现见 StartPacket.cpp 的initialize头部以T_START与序号 0 初始化随后保存文件大小并分别初始化源、目的两个路径。路径的序列化在 PathName.cpp 中完成initialize用StringUtils::string_length(value, MAX_LENGTH)截取路径长度MAX_LENGTH 255见 FilePacket.hpp写入m_length1 字节与指向路径的指针序列化时先写 1 字节长度、再写入对应字节数的路径内容反序列化时同样先读长度再把m_value指向缓冲区中的字符串地址PathName.cpp。因此路径长度上限为 255 字节。3.2 DATA 包类型 1传输文件数据分片DATA 包承载文件的实际内容分片载荷为字段长度说明字节偏移Byte offset4 字节本包数据在整个文件中的起始字节位置U32数据长度Data size2 字节本包携带的文件数据字节数U16文件数据File data可变实际数据内容实现见 DataPacket.cpp 的initialize其签名接收sequenceIndex、byteOffset、dataSize与指向数据的指针。序列化顺序为头部 → 4 字节偏移 → 2 字节数据长度 → 原始数据DataPacket.cpp。数据指针在反序列化时被直接指向输入缓冲区内的地址DataPacket.cpp因此反序列化得到的 DATA 包不拷贝数据其生命周期与源缓冲区绑定使用时需注意。3.3 END 包类型 2结束并携带校验和END 包宣告文件传输结束其载荷只有一个字段字段长度说明32 位哈希值Checksum4 字节按 CFDP 协议规则由文件数据计算得到的 32 位校验和实现见 EndPacket.cppinitialize(sequenceIndex, checksum)将传入的CFDP::Checksum对象的值getValue()保存为m_checksumValue序列化/反序列化时直接读写该 4 字节值EndPacket.cpp。接收方可用它验证整个文件在传输过程中是否发生损坏。3.4 CANCEL 包类型 3取消传输CANCEL 包用于中止传输不携带任何数据仅由头部构成类型CANCEL 序号。实现见 CancelPacket.cppbufferSize()直接返回头部大小反序列化时要求缓冲区剩余字节数为 0否则返回FW_DESERIALIZE_SIZE_MISMATCHCancelPacket.cpp保证格式的严格性。4 统一入口FilePacket 的 toBuffer / fromBufferFilePacket对外提供两个统一接口FilePacket.cppfromBuffer(const Buffer buffer)将一段原始字节解析为文件包。内部先构造SerialBuffer并fill()然后读头部再依据m_type分派给对应的StartPacket::fromSerialBuffer/DataPacket::fromSerialBuffer/EndPacket::fromSerialBuffer/CancelPacket::fromSerialBuffer若读到T_NONE返回FW_DESERIALIZE_TYPE_MISMATCH未知类型触发FW_ASSERT(0)FilePacket.cpp。toBuffer(Buffer buffer)把当前包写入字节缓冲区同样按类型分派。bufferSize()按类型返回所需的缓冲区大小T_NONE时返回 0。asStartPacket()/asDataPacket()/asEndPacket()/asCancelPacket()以对应类型视图读取包内容内部均先断言类型匹配FilePacket.cpp。fromStartPacket()/fromDataPacket()/fromEndPacket()/fromCancelPacket()从具体包对象构造FilePacketFilePacket.cpp。因此使用方式非常直观发送方构造具体包 →toBuffer编码接收方拿到字节 →fromBuffer解码 →asXxxPacket读取字段。5 END 包背后的 CFDP 校验和算法END 包携带的 32 位校验和由 CFDP/Checksum/Checksum.hpp 与 CFDP/Checksum/Checksum.cpp 实现。其核心是update(data, offset, length)把文件视为连续的 4 字节“字word”序列逐字累加到m_value32 位无符号溢出累加具体分三阶段处理若offset % 4 ! 0先按非对齐方式累加第一个不满 4 字节的“字”addWordUnaligned中间对齐部分以 4 字节为单位直接累加addWordAligned末尾不足 4 字节的部分再以非对齐方式收尾。addByteAtOffset将字节按其在 4 字节字内的位置左移8*(3-offset)位后加到校验和上Checksum.cpp。注意update的offset是相对文件起始的字节偏移——这与 DATA 包中的byteOffset语义一致发送方应按文件全局偏移逐片更新校验和接收方才能在 END 包中做整体比对。Checksum还提供构造默认 0 / 指定值 / 拷贝、getValue()、operator/operator!便于在测试中直接比较校验和值Checksum.hpp。6 在 Svc::FileDownlink 中的实际用法Fw::FilePacket在仓库中最重要的消费者是文件下传组件Svc::FileDownlink。在 Svc/FileDownlink/FileDownlink.cpp 中可以找到两处关键调用发送数据分片时构造Fw::FilePacket::DataPacket并调用filePacket.fromDataPacket(dataPacket)生成可发送的包FileDownlink.cpp发送起始声明时构造StartPacket后调用filePacket.fromStartPacket(startPacket)FileDownlink.cpp。即业务组件负责构造携带具体字段的包对象再由FilePacket统一完成编码与类型管理这正好呼应了第 4 节介绍的“构造 → fromXxxPacket → toBuffer”流程。若需了解完整的分片、调度与校验逻辑可继续阅读 Svc/FileDownlink/docs/sdd.md 及测试 Svc/FileDownlink/test/ut/FileDownlinkTester.cpp。7 测试验证四种包的往返一致性仓库在 Fw/FilePacket/test/ut/FilePacketMain.cpp 中提供了覆盖四种包类型的 GTest 用例均遵循“构造 → 序列化 → 反序列化 → 逐字段比较”的往返测试模式TEST(FilePacket, Header)以类型T_DATA、序号 10 构造头部往返后断言一致FilePacketMain.cppTEST(FilePacket, StartPacket)文件大小 10、源路径source、目的路径destFilePacketMain.cppTEST(FilePacket, DataPacket)序号 3、字节偏移 42、数据长度 10FilePacketMain.cppTEST(FilePacket, EndPacket)序号 15、校验和值 42FilePacketMain.cppTEST(FilePacket, CancelPacket)序号 10验证无载荷包可正确往返FilePacketMain.cpp。比较断言由 GTest 辅助命名空间提供Fw::GTest::FilePackets定义了各包类型的compare函数见 Fw/FilePacket/GTest/FilePackets.hpp 及其实现如 GTest/StartPacket.cpp通过ASSERT_EQ逐一比对头部、文件大小、路径、偏移、数据长度与校验和等字段。若要运行该模块测试可在构建目录中启用对应的 CMake 目标模块定义见 Fw/FilePacket/CMakeLists.txt。8 小结Fw::FilePacket是 F´ 内文件传输的统一分组格式格式骨架取自 CFDP PDUsdd.md每个包由 5 字节头部1 字节类型 4 字节序号与类型相关载荷组成四种类型分别为 START文件大小 双路径、DATA偏移 长度 数据、ENDCFDP 32 位校验和、CANCEL无载荷路径采用“1 字节长度 内容”的自描述编码最长 255 字节编解码入口统一为fromBuffer/toBuffer配合asXxxPacket/fromXxxPacket使用DATA 包反序列化不拷贝数据需注意缓冲区生命周期END 包校验和由CFDP::Checksum::update按 4 字节字累加得到偏移语义与 DATA 包byteOffset一致仓库内通过Svc::FileDownlink实际使用该类型并有完整的 GTest 往返测试保证格式的稳定性。如需进一步掌握文件传输的端到端流程如何分片、如何驱动发送、如何重组与校验可继续阅读 Svc/FileDownlink/docs/sdd.md 与 Svc/FileUplink 相关文档。【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址: https://gitcode.com/gh_mirrors/fp/fprime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Kornia 本地特征提取优化基准:基于 Oxford graf 数据集的 GPU/CPU/MPS 端到端加速与质量验证
Kornia 本地特征提取优化基准:基于 Oxford graf 数据集的 GPU/CPU/MPS 端到端加速与质量验证

计算机视觉人工智能深度学习图像处理 【免费下载链接】kornia 🐍 Geometric Computer Vision Library for Spatial AI 项目地址: https://gitcode.com/gh_mirrors/ko/kornia 点击查看 免费下载 本文基于 benchmarks/feature/graf_benchmark.md 记录的一… · 2026/9/24 16:53:51

PaddleHub xception41_imagenet 图像分类模块实战指南:从安装预测到 Xception41 网络源码解析
PaddleHub xception41_imagenet 图像分类模块实战指南:从安装预测到 Xception41 网络源码解析

人工智能大模型微调模型推理服务 【免费下载链接】PaddleFormers PaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle. 项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFormers 点击查看 免费下载 本篇… · 2026/9/24 16:53:44

西安24小时自助健身房解决方案实战指南:从系统架构到部署流程
西安24小时自助健身房解决方案实战指南:从系统架构到部署流程

西安24小时自助健身房解决方案实战指南:从系统架构到部署流程 随着全民健身意识的提升和夜间经济的发展,24小时自助健身房在西安等城市迅速走红。与传统健身房不同,24小时自助模式需要完全依靠智能化系统实现无人值守运营。本文将结合Java后端… · 2026/9/24 16:53:38

Android App 启动即崩溃无法 debug?用 TaoToken 统一 Key 排查配置链路
Android App 启动即崩溃无法 debug?用 TaoToken 统一 Key 排查配置链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 17:27:38

【股票交易】第 51 章 波动率与风险指标
【股票交易】第 51 章 波动率与风险指标

回到目录文章目录51.1 布林带:价格相对均值的位置与离散程度在移动平均线两侧增加会变化的边界带宽如何随数据变化收窄不预告方向,触轨不自动构成交易两倍标准差不是未来价格的保证区间51.2 ATR:把跳空纳入价格波动的观察为什么只看最高价减最… · 2026/9/24 17:27:38

2026重磅更新!英国 CBAM 正式认可中国全国碳市场!
2026重磅更新!英国 CBAM 正式认可中国全国碳市场!

一张清单,把中国碳市场的实际碳成本,和英国边境的碳税第一次连了起来。但“入选”和“免单”,中间还隔着一整套核算规则。 2026年8月27日,英国政府发布《UK CBAM:当前符合条件的碳定价机制》(List of curre… · 2026/9/24 17:27:38

工业相机的曝光方式:全局曝光、卷帘曝光、全局复位释放曝光
工业相机的曝光方式:全局曝光、卷帘曝光、全局复位释放曝光

工业相机常见的曝光方式包含全局曝光(Global shutter,也称全局快门、帧曝光)、卷帘曝光(Rolling shutter,也称卷帘快门、行曝光)以及基于卷帘曝光并结合全局曝光优势的全局复位释放曝光(Global … · 2026/9/24 17:27:38

Linux 下 Redis Cluster 安装与部署
Linux 下 Redis Cluster 安装与部署

Linux 下 Redis Cluster 安装与部署 一、环境信息系统主机密码内存端口CentOS-7192.168.4.81jxbd816G主:7001,备:7002CentOS-7192.168.4.82jxbd826G主:7001,备:7002CentOS-7192.168.4.85jxbd856G主&#xf… · 2026/9/24 17:27:20

【股票交易】第 49 章 移动平均线与趋势跟踪
【股票交易】第 49 章 移动平均线与趋势跟踪

回到目录文章目录49.1 移动平均线是什么简单移动平均线:不断更新的价格平均数股价下跌,均线为什么仍然上涨指数移动平均线 :给近期价格更高权重49.2 移动平均线有什么用途为趋势观察提供一致的参照周期选择决定观察尺度衡量价格偏离近期平均水… · 2026/9/24 17:27:07

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码