虚拟方法
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
。