需要先依赖添加:
dll链接:https://pan.baidu.com/s/1U4gtQXWsI-ElxEbn8PA06g
提取码:9999
然后在VS中引入对应包,如下图
先介绍一下几个H5类的区别
H5D 数据操作
H5F 文件操作
H5S 矩阵空间操作
H5T 数据类型操作
接下来先介绍文件读取方法,相对略简单
//定义文件路径 string filename = "111.h5"; //新建dataset GetHdf5DataSet getData = new GetHdf5DataSet(); //获取目录数组 string[] groupNames = getData.hdf5_getData(filename); //只读模式打开 H5FileId fileId = H5F.open(filename, H5F.OpenMode.ACC_RDWR); //取其中某一目录 H5DataSetId dataSetId = H5D.open(fileId, groupNames[0]); //获取目录的spaceid H5DataSpaceId h5DataSpaceId = H5D.getSpace(dataSetId); //查询目录在h5位置 int rank = H5S.getSimpleExtentNDims(h5DataSpaceId); //查询目录矩阵大小 long[] a = H5S.getSimpleExtentDims(h5DataSpaceId); //建立对应大数组 double[,] readDataBack = new double[a[0], a[1]]; //目录数据存入内存 H5D.read(dataSetId, new H5DataTypeId(H5T.H5Type.NATIVE_DOUBLE), new H5Array<double>(readDataBack));
然后是写入方法,HDF5可以创建嵌套的目录结构,创建方法如下图
//文件句柄 H5FileId file; //创建文件,存在则覆盖写入 file = H5F.create("5.h5", H5F.CreateMode.ACC_TRUNC); //创建多层级子目录 H5GroupId groupId = H5G.create(file, "children01"); H5GroupId groupId03 = H5G.create(file, "children04"); H5GroupId subGroup = H5G.create(groupId, "children02"); H5GroupId subGroup01 = H5G.create(subGroup, "children03"); H5G.close(subGroup01); H5G.close(groupId03); H5G.close(subGroup); H5G.close(groupId); H5F.close(file);
目录效果
接下来是完整的数据写入
string fime_name = "new_write.h5"; H5FileId fileId = H5F.create(fime_name, H5F.CreateMode.ACC_TRUNC); long[] dims = new long[1]; dims[0] = 10; //一维数据准备 int[] data_one_demo = new int[10]; for (int i = 0; i < 10; i++) { data_one_demo[i] = i; } //二维数据准备 int[,] data_two_demo = new int[10, 10]; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { data_two_demo[i, j] = i * j; } } //三维数据准备 int[,,] data_three_demo = new int[10, 10, 10]; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { for (int k = 0; k < 10; k++) { data_three_demo[i, j, k] = i * j * k; } } } H5DataSpaceId spaceId = H5S.create_simple(1, dims); H5DataTypeId typeId = H5T.copy(H5T.H5Type.NATIVE_INT); // 获取数据类型占用空间 int typeSize = H5T.getSize(typeId); //不知道干啥的两句,注释了似乎也没影响 H5T.setOrder(typeId, H5T.Order.BE); H5T.setOrder(typeId, H5T.Order.LE); // 创建h5一维数据块 H5DataSetId dataSetId = H5D.create(fileId, "/data_01", typeId, spaceId); // 创建h5二维数据块 H5DataSetId dataSetId_two_demo = H5D.create(fileId, "/data_02", typeId, H5S.create_simple(2, new long[2]{10,10})); // 创建h5三维数据块 H5DataSetId dataSetId_three_demo = H5D.create(fileId, "/data_03", typeId, H5S.create_simple(3, new long[3] { 10, 10 ,10})); // 一维写入 H5D.write(dataSetId, new H5DataTypeId(H5T.H5Type.NATIVE_INT), new H5Array<int>(data_one_demo)); // 二维写入 H5D.write(dataSetId_two_demo, new H5DataTypeId(H5T.H5Type.NATIVE_INT), new H5Array<int>(data_two_demo)); // 三维写入 H5D.write(dataSetId_three_demo, new H5DataTypeId(H5T.H5Type.NATIVE_INT), new H5Array<int>(data_three_demo)); //必须关闭全部句柄 H5D.close(dataSetId); H5D.close(dataSetId_two_demo); H5D.close(dataSetId_three_demo); H5S.close(spaceId); H5T.close(typeId); H5F.close(fileId); //带初始种子的随机写入 //int singleValue = 999999; //H5D.writeScalar(dataSetId, new H5DataTypeId(H5T.H5Type.NATIVE_INT),ref singleValue);
效果如下:
(九九乘法表)