java - 在 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)分隔文件或逐字节迭代?就像扫描仪示例一样,只是不转换表示
解决方案
推荐阅读
- terraform - 地形。如何使用 variable.tf 文件中的列表(字符串)在命令行中传递多个值?
- windows - (Windows 10) Miniconda Pyopencl - ImportError: DLL load failed while importing _cl: 找不到指定的程序
- c - CS50x Pset 2 可读性:为什么 L 和 S 计算不正确?
- android - 我如何将一个班级送到另一个班级?
- android - Android Studio onStart 不执行
- c++ - 代码不为继承的函数参数赋值,也不调用函数
- swift - 有没有办法在不调用它的情况下取消转义闭包?
- python - 如何使用python更改条件“大于或等于”的excel单元格中字符串的字体颜色?
- json - 我还能如何格式化数据?swift parse json - 无法读取数据,因为它的格式不正确
- python-3.x - 为什么 pyinstaller 可执行文件会更改格式和分辨率?