需要先依賴添加:
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);
效果如下:
(九九乘法表)