【问题标题】:How to use pcre2_match with binary subject data如何将 pcre2_match 与二进制主题数据一起使用
【发布时间】:2020-09-01 16:30:36
【问题描述】:

我正在寻求有关使用 pcre2_match 的说明。

背景:我正在使用 PCRE2 搜索二进制文件中的 unicode 文本片段,不区分大小写。

这个函数的声明:

int pcre2_match(const pcre2_code *code, PCRE2_SPTR subject,
  PCRE2_SIZE length, PCRE2_SIZE startoffset,
  uint32_t options, pcre2_match_data *match_data,
  pcre2_match_context *mcontext);

该函数的手册页随后指出:

length 和 startoffset 值是代码单位,而不是字符。

现在,当主题数据是二进制时,我无法确定代码单元,因为数据不一定是任何干净的 UTF 格式。因此我无法确定代码单元。

我只知道主题数据的字节数。而且似乎没有任何选项可以让我告诉该函数它将查看二进制数据。

如何确保此函数了解我传递的字节数,以便它不会尝试检测代码点,从而可能超过或缩短我希望它搜索的内存量?

【问题讨论】:

  • 我很难相信 lengthstartoffsetnot 字节数。是什么让您认为它们不是?
  • 我认为您误解了该手册页声明。你怎么知道长度呢? C 中的 char 也不是字符 =D
  • @Jason 在 OP 使用 16 位或 32 位代码单元版本的库的(不太可能)情况下,它们不是字节数。请参阅pcre.org/current/doc/html/pcre2.html的介绍

标签: c pcre


【解决方案1】:

代码单元是输入的原子片段。至于pcre2_match_8,是byte,pcre2_match_16,是uint16_t等。如果传递了invalid utf选项,可以搜索二进制数据,但是从任意字节位置只能搜索utf8。如果您搜索 utf16,它将每隔一个字节搜索一次。自然对齐是 cpu 要求,PCRE 必须遵守它。

【讨论】:

  • 啊,现在说得通了。在你提到专门的_8' etc. functions, I found https://www.pcre.org/current/doc/html/pcre2api.html#SEC13 which explains this. So it appears that I can safely assume that I'm working with byte units by linking against libpcre2-8`之后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多