HDF5 工作總結 - HDF5 superblock 部分 superblock version 及 format signature 的解析

一、 HDF5 介紹:

1.  HDF5:Hierarchical Data Format Version 5,  層次性數據格式第五版,是一種存儲相同類型數值的大數組的機制,適用於可被層次性組織且數據集需要被元數據標記的數據模型,常用的接口模塊爲 h5py。

參考資料:

HDF5 簡介:https://blog.csdn.net/mzpmzk/article/details/89188968

HDF5格式特點:https://wenku.baidu.com/view/e92c13daad51f01dc281f14b.html?from=search

HDF5 for Python:http://docs.h5py.org/en/stable/index.html

Low-level API for h5py:http://api.h5py.org/index.html

H5F: File Interface:https://support.hdfgroup.org/HDF5/doc/RM/RM_H5F.html

HDF5 File Format Specification Version 3.0:https://portal.hdfgroup.org/display/HDF5/File+Format+Specification

二、 工作介紹:

1.  資源鏈接: https://pan.baidu.com/s/1D3N4mYRTCqojJ4zd_iA1pA     提取碼: wind

2.  壓縮包說明:

​​​​​​​hdf5-1.10.5:hdf5庫;
Panoply:查看hdf5樣例數據軟件;
樣例數據文件夾:hdf5數據

3.  需求說明:

編程語言使用java/python/c等都可,注意寫清代碼註釋;
讀取樣例數據,查看superblock中superblock version的值(0/1/2/3);
讀取樣例數據,查看superblock中format signature部分的內容,並進行賦值(具體賦值內容需根據實際得到的format signature的內容決定)。

三、 程序代碼: 

import struct


file_path = 'D:\BaiduNetdiskDownload\hdf5\data\\'
file_name = ['as4.h5', 'HJ1B-CCD1-30-68-20140707-L20001175896-1.h5', 'HJ1B-CCD1-30-68-20140707-L20001175896-2.h5', 'HJ1B-CCD1-30-68-20140707-L20001175896-3.h5', 'HJ1B-CCD1-30-68-20140707-L20001175896-4.h5']


def getSuperBlockInfo(path):
    
    '''檢查format signature是否符合規範,返回superblock version和format signature的值
    
    函數只需一個參數,爲HDF5文件的路徑,函數首先檢查format signature的合法性,format signature即HDF5文件標識符,爲文件的前8個字節,
    首個字節要求爲非ascii碼值,後7個字節爲確定的值,不合法則進行的修改。之後獲取superblock version值,superblock version值爲0或1 
    與 2或3分別代表兩種不同的superblock結構。
    
    Args:
        version:一個無符號整數,表示superblock version的值。
        formatSigna5ture: 一個元組,代表format signature的值,長度爲8,元素代表format signature 每個字節的值,爲無符號十進制整數。
    
    Returns:55555
        函數有兩個返回值,
        第一個返回值爲一個無符號整數,代表super blockversion,
        第二個返回值爲一個元組,長度爲8,代表format signature。
    
    '''
    
    fp = open(path, 'rb+')    10    #打開文件流
    
    
    #檢查並修正formatSignature首位(要求其爲非ascii值)
    firstByte = struct.unpack_from("1B", fp.read(1))  #讀取第一個字節(10進制無符號整型)

    if(firstByte[0] <= 127):      
        fp.seek(0)                #文件指針前移
        fp.write((137).to_bytes(1, byteorder = 'little', signed = False))  #設置爲非ascii值


    #檢查並修正formatSignature後7位
    standard = (72, 68, 70, 13, 10, 26, 10)    #標準formatSignature後7個字節的值    
    fp.seek(1)
    formatx = struct.unpack_from("7B", fp.read(7)) #獲取文件中formatSignature後7個字節的值

    if(formatx != standard):
        fp.seek(1)
        for i in standard:   #將標準值依次寫入
            fp.write((i).to_bytes(1, byteorder = 'little', signed = False))


    #讀取formatSignature
    fp.seek(0)
    formatSignature = struct.unpack_from("8B", fp.read(8))


    #讀取superblock version
    fp.seek(8)
    version = struct.unpack_from("1B",
                                 fp.read(1))[0]
    fp.close()
    
    return version, formatSignature


version, formatSignature = getSuperBlockInfo(file_path + file_name[0])

print(version)

#將formatSignature轉換爲bytes形式顯示
for i in formatSignature: 
    print((i).to_bytes(1, byteorder = 'little', signed = False))

PS:HDF5 文件格式所用分析軟件 : uedit

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章