ODC库使用:数据编码
12/02
本文最后更新于
2024年12月02日,已超过
89天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
数据编码
编码过程是解码过程的逆操作。编码就是将内存中数据转换成Encoder
对象,然后输出到数据文件流(比如文件中)。
数据编码过程除了前面介绍的顶层类对象外,主要涉及到解码对象Encoder
。
- Encoder
在编码时需要指定内存布局信息。
以列主元内存布局为例:
integer(8), parameter :: nrows = 1000
integer, parameter :: ncols = 6
real(8), target :: data(nrows, ncols)
! set up the data here...
type(odc_encoder) :: encoder
logical, parameter :: column_major = .true.
integer, target :: outunit
integer(8), target :: bytes_written
rc = encoder%initialise()
rc = encoder%add_column("column1", ODC_INTEGER)
rc = encoder%add_column("column2", ODC_INTEGER)
rc = encoder%add_column("column3", ODC_REAL)
rc = encoder%add_column("column4", ODC_STRING)
rc = encoder%add_column("column5", ODC_REAL)
! column4 is a 16-byte string column (hence takes 2 cols in the array --> ncols=6)
rc = encoder%column_set_data_size(4, 16);
! column major is the default in Fortran, so the column_major argument can be omitted
rc = encoder%set_data(data)
! encode the data here...
rc = encoder%free()
首先使用encoder%initialize()
初始化encoder对象。
然后构建表格列属性,通过encoder%add_column
添加,设置列名称和数据类型。对于字符串类型,可以通过encoder%column_set_data_size
设置实际数据长度,以上示例设置了16个字节,代表该列信息在数组中占据两列。
然后通过encoder%set_data
设置数据编码的数据源数组(建立数组与ODB-2 encoder对象连接)。
当构建好Encoder
对象后,编码数据进frames中。
integer :: outunit
integer(8), target :: bytes_written
open(newunit=outunit, file="imaginary/path.odb", access="stream", form="unformatted")
rc = encoder%encode(outunit, bytes_written)
close(outunit)
以上使用Fortran文件打开语句open
创建流格式的二进制文件,通过encoder%encode
函数将数据编码写入Fortran文件单元对应的文件中。
如果希望存放flags,可以使用bitfields
列设置存放,每列最多放置32位。在一个整数内,bits可以通过它们的offset进行识别和命名。
integer(8), parameter :: nrows = 1000
integer, parameter :: ncols = 1
integer(8), target :: data(nrows)
! set up the data here...
type(odc_encoder) :: encoder
rc = encoder%initialise()
rc = encoder%set_row_count(nrows) ! 设置当前encoder对象分配的行数
rc = encoder%add_column("flags", ODC_BITFIELD) ! 添加Bitfield列
rc = encoder%column_add_bitfield(1, "flag_a", 1) ! 第一列添加flag_a名称的列,其占1 bit
rc = encoder%column_add_bitfield(1, "flag_b", 2) ! 第一列添加flag_b名称的列,其占2 bit
rc = encoder%column_add_bitfield(1, "flag_c", 3)
rc = encoder%column_add_bitfield(1, "flag_d", 1)
! 设置第1列占8个字节,列宽为8字节,数据数组是data
rc = encoder%column_set_data_array(1, 8, stride=8, data=c_loc(data))
! encode the data here...
rc = encoder%free()
- Properites
同时可以对frame增加属性描述。
rc = encoder%add_property("encoded_by", "ECMWF")

