首页 > 解决方案 > 在 Java 中的大二进制文件上匹配十六进制正则表达式 (\x)

问题描述

我试图在一个非常大的二进制文件中使用匹配头的字节序列的正则表达式。

我的正则表达式如下所示:

Pattern pattern = Pattern.compile("\u6484\u7194\u0018\u608c\u0e86\u7194");

或者

Pattern pattern = Pattern.compile("\\x64\\x84\\x71\\x94\\x00\\x18\\x60\\x8c\\x0e\\x86\\x71\\x94");

按照这个模式,它应该选择下一个 512 字节,包括模式,并将它们输出到一个变量(byte[] 或 char[])中,比如...\\u7194.{250}...\\x94.{500}

有几种方法可以实现这一点。我不想将整个文件缓冲到一个字节 [] 中以匹配我的模式,因为这些文件可能是几千兆字节。遍历每个字节并等待模式工作,但根据文件大小,速度极慢且不现实。我也不想将文件切成块,因为我必须为需要的 512 字节位于两个块之间的边缘情况做准备。

在字节数据流上匹配模式将是理想的,但遗憾的是,如果不先将其解释为字符串,我就找不到方法。例如,使用将文件作为输入的扫描仪可以匹配整个文件上的正则表达式(带有Scanner.findWithinHorizon(String pattern,int horizon)),但遗憾的是这仅适用于字符数据。将数据转换为字符序列将更改内容并使使用 \x 或 \u 进行模式匹配变得不可能。它只会匹配实际导致可打印字符的十六进制,例如匹配字符“d”的第一个 \x64

有没有办法将我的十六进制模式智能地匹配到大文件上,而无需使用 Java(最好是 1.8)分隔文件或逐字节迭代?就像扫描仪示例一样,只是不转换表示

这里是应该选择的二进制文件中的 512 个字节的示例

标签: javaregexbinaryjava-stream

解决方案


推荐阅读