TypechoJoeTheme

MetMan's Blog

网站页面
文章目录

ODC库使用:数据编码

MetMan博 主神仙
2024-12-02
/
0 评论
/
81 阅读
/
361 个字
/
百度已收录
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")
odcodb
朗读
赞(0)
赞赏
感谢您的支持,我会继续努力哒!
版权属于:

MetMan's Blog

本文链接:

https://blog.metman.top/index.php/archives/158/(转载时请注明本文出处及文章链接)

评论 (0)

互动读者

标签云

最新回复

  1. tqymnonccc打酱油
    2024-09-27
  2. toibdpojay打酱油
    2024-09-22
  3. yvctxyevvw打酱油
    2024-09-22
  4. frezhwzwuq打酱油
    2024-09-22
登录
X
用户名
密码