虚拟方法

GioConverterconvert

since: 2.24

声明 [源]

GConverterResult
convert (
  GConverter* converter,
  void* inbuf,
  gsize inbuf_size,
  void* outbuf,
  gsize outbuf_size,
  GConverterFlags flags,
  gsize* bytes_read,
  gsize* bytes_written,
  GError** error
)

描述 [源]

这是转换数据时使用的主要操作。需要在循环中多次调用它,每次调用都将执行一些工作,即产生一些输出(在outbuf中)或消耗一些输入(从inbuf中)或两者都有。如果没有工作可做,将返回错误。

请注意,单个调用可能不会消耗所有输入(或完全没有输入)。另外,即使在没有输入的情况下,由于转换器中存储的状态产生输出,也可能产生输出。

如果在产生或消耗数据后发生错误,则仅报告成功的转换,并将错误返回到下一次调用。

完整的转换循环涉及重复调用此方法,每次提供新的输入和输出空间。当在inbuf中的数据用尽后,必须设置标志G_CONVERTER_INPUT_AT_END。循环将(除非发生某些错误)每次都以G_CONVERTER_CONVERTED返回,直到所有数据被消耗并且所有输出都被产生,然后返回G_CONVERTER_FINISHED。注意,即使没有设置G_CONVERTER_INPUT_AT_END,也可能会返回G_CONVERTER_FINISHED,例如,在解压缩转换器中,可以通过数据检测数据的末尾(并且在压缩数据之后可能有其他数据)。

在成功转换了一些数据后,将bytes_read设置为从inbuf中读取的字节数,并将bytes_written设置为指示写入outbuf的字节数。如果有更多数据要输出或消耗(即除非指定了G_CONVERTER_INPUT_AT_END),则返回G_CONVERTER_CONVERTED,如果没有更多数据要输出,则返回G_CONVERTER_FINISHED

错误时返回G_CONVERTER_ERROR,并将错误设置为相应的值。某些错误需要特殊处理

如果没有足够的空间来写入转换后的数据,则返回G_IO_ERROR_NO_SPACE,应用程序应该再次调用该函数,但使用更大的outbuf以继续。

如果没有足够的输入来完全确定转换应产生的内容,并且没有设置G_CONVERTER_INPUT_AT_END标志,则返回G_IO_ERROR_PARTIAL_INPUT。例如,在转换文本时出现不完整的多字节序列时会发生这种情况,或者当正则表达式匹配到最后一个输入的末尾(且可能匹配更多的输入)。当inbuf_size为零且没有更多数据要产生时也可能发生这种情况。

在这种情况下,应用程序应该读取更多的输入,然后再次调用该函数。如果更多的输入表明没有更多数据要产生,则再次以相同的数据调用该函数,但设置G_CONVERTER_INPUT_AT_END标志。这可能会导致转换完成,例如在正则表达式匹配的情况下(或者在字符集转换中,输入实际上是部分的,导致再次失败以返回G_IO_ERROR_PARTIAL_INPUT)。

g_converter_convert()返回G_CONVERTER_FINISHED后,转换器对象处于无效状态,不允许再次调用g_converter_convert()。此时,您可以释放对象或调用g_converter_reset()将其重置到初始状态。

如果设置了标志 G_CONVERTER_FLUSH,则会修改转换过程,尝试将所有内部状态写入输出。应用程序需要多次使用设置标志的函数调用,当所有输入已被消耗且所有内部状态都生成后,则返回 G_CONVERTER_FLUSHED(或者在真正到达结束时返回 G_CONVERTER_FINISHED),而不是 G_CONVERTER_CONVERTED。这在数据中间进行,与输入流末尾发生的情况 somewhat 相似。

这对于不同的转换有不同的含义。例如,在一个压缩转换器中,这意味着我们将所有压缩状态冲刷到输出,这样如果您解压缩压缩数据,就可以得到全部输入数据。但是,由于填充,这样做可能会导致最终文件更大。另一个例子是正则表达式转换,如果在冲刷数据的末尾有一个匹配,但还有一个潜在更长的匹配。在没有冲刷的情况下,我们会要求更多输入,但是在冲刷时,我们将这种情况视为输入的结尾并执行匹配。

冲刷并不总是可能的(例如,如果字符集转换器在部分多字节序列上冲刷)。转换器应该尝试产生尽可能多的输出,然后返回一个错误(通常是 G_IO_ERROR_PARTIAL_INPUT)。

上市以来:2.24

参数

inbuf

类型: 一个guint8数组

包含要转换数据的缓冲区。

该参数可以是 NULL
数组长度在 inbuf_size 参数中指定。
数据归调用者所有。
inbuf_size

类型: gsize

inbuf中的字节数。

outbuf

类型: 一个guint8数组

用于写入转换数据的缓冲区。

数组长度在 outbuf_size 参数中指定。
数据归调用者所有。
outbuf_size

类型: gsize

outbuf中的字节数,必须至少为

flags

类型: GConverterFlags

控制转换细节的 GConverterFlags

bytes_read

类型: gsize*

在成功时将设置为从 inbuf 中读取的字节数。

该参数将由函数设置。
bytes_written

类型: gsize*

在成功时将设置为写入 outbuf 的字节数。

该参数将由函数设置。
error

类型: GError **

用于可恢复错误的返回位置。

该参数可以是 NULL
如果返回位置不是 NULL,则必须将其初始化为空的 GError*
如果没有错误,虚拟函数将保留参数初始化为 NULL
在出现错误的情况下,该参数将设置为一个新分配的 GError;调用者将负责拥有数据,并获得释放它的责任。

返回值

类型: GConverterResult

一个 GConverterResult,在出错时返回 G_CONVERTER_ERROR