HDF5:我是否需要明确设置字节顺序?

时间:2018-01-04 09:19:33

标签: c++ hdf5

在HDF5组手册中的某些HDF5示例中,字节顺序显式设置为“little endian”。在一些其他示例中,没有给出明确的定义。我现在的问题是,我需要关心字节顺序吗?我可以简单地指定它,并依赖于默认值吗?

来自example in which the byte order is explicitly specified

的摘录
DataSpace dataspace( RANK, dimsf );

IntType datatype( PredType::NATIVE_INT );
datatype.setOrder( H5T_ORDER_LE );

DataSet dataset = file.createDataSet( DATASET_NAME, datatype, dataspace );

如果我只使用以下内容怎么办?

DataSpace dataspace( RANK, dimsf );

DataSet dataset = file.createDataSet( DATASET_NAME, PredType::NATIVE_INT, dataspace );

(我已经验证了编译和运行,如果我用HDFView和h5py读取,则会提供相同的数据)

2 个答案:

答案 0 :(得分:1)

这不是一个明确的答案,但我发现值得分享(而且评论太多了):

来自HDF5用户指南Chapter 6 HDF5 Datatypes

  

2.3数据传输(读写)

     

数据类型最常见的用途可能是从数据集或属性中写入或读取数据。在这些操作中,每个数据元素从源传输到目标(可能重新排列元素的顺序)。由于源和目标不需要相同(即,一个是磁盘而另一个是存储器),因此传输需要源元素和目标元素的格式。因此,数据传输使用两个数据类型对象,用于源和目标。

     

写入数据时,源是内存,目标是磁盘(文件)。 memory数据类型描述了机器内存中数据元素的格式,file数据类型描述了磁盘上数据元素的所需格式。同样,在读取时,源数据类型描述了磁盘上数据元素的格式,目标数据类型描述了内存中的格式。

     

在最常见的情况下,file数据类型是创建数据集时指定的数据类型,而memory数据类型应该是适当的NATIVE类型。

这与之前的评论中所说的内容并不矛盾......

答案 1 :(得分:1)

在写入和读取数据时,HDF5库会考虑两种数据类型,即磁盘上的数据类型。

例如,考虑H5Dread的文档:

  

(部分)数据集的内存数据类型由。标识   标识符mem_type_id。   (......)   数据类型转换在读取或写入时发生,并且是自动的。

磁盘上的数据类型""将从数据集的元数据中推断出来。用户指南中也对此进行了说明,请参阅The Data Transfer Pipeline(相关部分为"转换"在图中)和Data Transfer: Datatype Conversion and Selection以获取详细信息。

因此,在阅读数据时,您不需要关心磁盘上的内容,它将由HDF5处理(包括字节序)。

如果在调用H5Dwrite时动态地将64位浮点数存储到32位浮点数据集中,则会发生另一次转换。

写入数据时,如果您对存储类型有限制,可以选择HDF5提供的本机类型或另一种本机类型。我使用HDF5多年来从C,Fortran和Python,从来没有担心任何这一点。 (好吧,经过长时间的掌握HDF5中的几个概念)。