目录前言一、搭建环境二、H5文件的结构三、生成H5文件的C代码总结前言HDF5Hierarchical Data Format 5简称 H5作为一种面向海量、异构、多维数据的高效存储格式凭借其跨平台性、高压缩比、支持复杂数据结构如数组、矩阵、嵌套数据集以及对元数据的原生支持等特性已成为科学计算、工业物联网、嵌入式系统、航空航天等领域存储结构化数据的首选格式。相较于传统的文本文件如 TXT、CSV或二进制文件H5 文件能够在保证数据完整性的同时大幅提升数据读写效率与存储空间利用率尤其适配工业场景下传感器数据、标定参数、行为特征等结构化数据的长期存储与跨系统交互需求。C 语言作为底层开发的核心语言以其高性能、低资源占用、可直接操作内存的特性广泛应用于嵌入式设备、工业控制模块、边缘计算节点等资源受限的场景。在这类场景中直接通过 C 语言生成 H5 文件能够避免跨语言调用如 C/Python带来的性能损耗与兼容性问题实现数据从采集到存储的 “端到端” 轻量化处理这也是工业级数据采集系统、设备标定系统等场景的核心需求之一。一、搭建环境生成H5文件需要依赖hdf5-1.14.3库所以需要先进行交叉编译hdf5-1.14.3库具体交叉编译库的方法可以参考我的这篇文章H5文件库在x86架构下交叉编译成arm64架构-CSDN博客环境搭建完成后就可以调用库进行编程了二、H5文件的结构举个例子H5文件一般是由组、数据集组成组是包含数据集的例如我这里的mice就是数据组ParameterData就是数据集然后数据集就是存储数据的一般行是存储数据列是存储数据类别三、生成H5文件的C代码#include hdf5.h #include stdio.h #include stdlib.h #include string.h #define FILE_NAME sensor_data.h5 // 创建一个通用的参数组如mouse_1或running_wheel herr_t create_parameter_group(hid_t parent_id, const char *group_name) { hid_t group_id; hid_t dataspace_id, dataset_id; herr_t status; // 创建组 group_id H5Gcreate(parent_id, group_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if (group_id 0) { fprintf(stderr, Failed to create group %s\n, group_name); return -1; } // 1. 创建 ParameterTime 数据集 (7x2) { hsize_t dims_time[2] {7, 2}; int time_data[7][2] { {0, 15}, {1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}, {6, 0} }; dataspace_id H5Screate_simple(2, dims_time, NULL); dataset_id H5Dcreate(group_id, ParameterTime, H5T_NATIVE_INT, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); status H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, time_data); H5Dclose(dataset_id); H5Sclose(dataspace_id); } // 2. 创建 ParameterName 数据集 (4个字符串) { hsize_t dims_name[1] {4}; const char *names[4] {speed, forward_distance, reverse_distance, total_distance}; hid_t str_type H5Tcopy(H5T_C_S1); H5Tset_size(str_type, 32); // 设置字符串最大长度 dataspace_id H5Screate_simple(1, dims_name, NULL); dataset_id H5Dcreate(group_id, ParameterName, str_type, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); status H5Dwrite(dataset_id, str_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, names); H5Dclose(dataset_id); H5Sclose(dataspace_id); H5Tclose(str_type); } // 3. 创建 ParameterData 数据集 (12x4, 全0) { hsize_t dims_data[2] {12, 4}; double data[12][4] {0}; // 初始化为全0 dataspace_id H5Screate_simple(2, dims_data, NULL); dataset_id H5Dcreate(group_id, ParameterData, H5T_NATIVE_DOUBLE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); status H5Dwrite(dataset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); H5Dclose(dataset_id); H5Sclose(dataspace_id); } H5Gclose(group_id); return 0; } int main() { hid_t file_id, history_group_id, mice_group_id; herr_t status; // 创建HDF5文件 file_id H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if (file_id 0) { fprintf(stderr, Failed to create file %s\n, FILE_NAME); return 1; } // 创建 /HistoryParameter 组 history_group_id H5Gcreate(file_id, /HistoryParameter, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if (history_group_id 0) { fprintf(stderr, Failed to create /HistoryParameter group\n); H5Fclose(file_id); return 1; } // 创建 /HistoryParameter/mice 组 mice_group_id H5Gcreate(history_group_id, mice, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if (mice_group_id 0) { fprintf(stderr, Failed to create /HistoryParameter/mice group\n); H5Gclose(history_group_id); H5Fclose(file_id); return 1; } // 创建5个mouse组: mouse_1 到 mouse_5 for (int i 1; i 5; i) { char mouse_name[16]; snprintf(mouse_name, sizeof(mouse_name), mouse_%d, i); status create_parameter_group(mice_group_id, mouse_name); if (status 0) { fprintf(stderr, Failed to create %s\n, mouse_name); break; } } // 创建 running_wheel 组 status create_parameter_group(history_group_id, running_wheel); if (status 0) { fprintf(stderr, Failed to create running_wheel group\n); } // 关闭所有资源 H5Gclose(mice_group_id); H5Gclose(history_group_id); H5Fclose(file_id); printf(HDF5 file %s created successfully!\n, FILE_NAME); return 0; }编译通过后最后就可以生成一份H5文件了如图所示总结使用C语言生成HDF5格式文件的方法。HDF5作为高效存储格式适用于科学计算、工业物联网等领域。文章首先说明环境搭建需要交叉编译hdf5-1.14.3库然后解析H5文件由组和数据集组成的结构。重点展示C代码实现包括创建参数组、时间/名称/数据等数据集最终生成包含多个mouse组和running_wheel组的H5文件。该方法可直接在嵌入式等资源受限场景中使用实现数据采集到存储的轻量化处理。