- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有办法在powershell中确定指定的文件是否包含指定的字节数组(在任何位置)?
就像是:
fgrep --binary-files=binary "$data" "$filepath"
function posOfArrayWithinArray {
param ([byte[]] $arrayA, [byte[]]$arrayB)
if ($arrayB.Length -ge $arrayA.Length) {
foreach ($pos in 0..($arrayB.Length - $arrayA.Length)) {
if ([System.Linq.Enumerable]::SequenceEqual(
$arrayA,
[System.Linq.Enumerable]::Skip($arrayB, $pos).Take($arrayA.Length)
)) {return $pos}
}
}
-1
}
function posOfArrayWithinFile {
param ([byte[]] $array, [string]$filepath)
posOfArrayWithinArray $array (Get-Content $filepath -Raw -AsByteStream)
}
// They return position or -1, but simple $false/$true are also enough for me.
最佳答案
对不起,补充答案。这样做并不常见,但普遍问题引起了我的兴趣,我最初的“using -Like”答案的方法和信息完全不同。顺便说一句,如果您正在寻找对“我相信它必须存在于 .NET 中”问题的积极回应以接受答案,那么它可能不会发生,StackOverflow 搜索与 C#
相结合存在同样的问题。 , .Net
或 Linq
.
无论如何,事实上没有人能够找到唯一的假设 .Net
到目前为止,有几个 semi-.Net
是可以理解的。正在使用解决方案,但我相信这会导致通用功能的一些不受欢迎的开销。
假设您字节数组 (正在搜索的字节数组)和 SearchArray (要搜索的字节数组)是完全随机的。 中的每个字节只有 1/256 的机会。字节数组 将匹配 的第一个字节SearchArray .在这种情况下,您不必进一步查看,如果匹配,则第二个字节也匹配的可能性为 1/2562,依此类推。这意味着内循环将仅运行大约 。 1.004 是外循环的倍数。换句话说,内循环之外(但在外循环中)的所有性能几乎与内循环中的性能一样重要!
请注意,这也意味着 500Kb 随机序列存在于 100Mb 随机序列中的可能性几乎为零。 (那么,您给定的二进制序列实际上有多随机?,如果它们远非随机,我认为您需要在问题中添加更多细节)。对于我的假设,更糟糕的情况是 字节数组 存在相同的字节(例如 0, 0, 0, ..., 0, 0, 0
)和 SearchArray 以不同字节结尾的相同字节(例如 0, 0, 0, ..., 0, 0, 1
)。
基于此,它再次表明(我也在其他一些答案中证明了这一点) native PowerShell 命令并没有那么糟糕,甚至可能超过 .Net/ Linq
在某些情况下命令。在我的测试中,以下 Find-Bytes
函数大约是您问题中函数的 20% 到两倍:
查找字节
返回 -Search
所在位置的索引字节序列在 -Bytes
中找到字节序列。如果未找到搜索序列 $Null
( [System.Management.Automation.Internal.AutomationNull]::Value
) 被返回。
参数 -Bytes
要搜索的字节数组-Search
要搜索的字节数组-Start
定义在 Bytes
中开始搜索的位置序列(默认: 0
)-All
默认情况下,只会返回找到的第一个索引。使用 -All
switch 返回找到的任何其他搜索序列的剩余索引。
Function Find-Bytes([byte[]]$Bytes, [byte[]]$Search, [int]$Start, [Switch]$All) {
For ($Index = $Start; $Index -le $Bytes.Length - $Search.Length ; $Index++) {
For ($i = 0; $i -lt $Search.Length -and $Bytes[$Index + $i] -eq $Search[$i]; $i++) {}
If ($i -ge $Search.Length) {
$Index
If (!$All) { Return }
}
}
}
用法示例:
$a = [byte[]]("the quick brown fox jumps over the lazy dog".ToCharArray())
$b = [byte[]]("the".ToCharArray())
Find-Bytes -all $a $b
0
31
基准
$a = [byte[]](&{ foreach ($i in (0..500Kb)) { Get-Random -Maximum 256 } })
$b = [byte[]](&{ foreach ($i in (0..500)) { Get-Random -Maximum 256 } })
Measure-Command {
$y = Find-Bytes $a $b
}
Measure-Command {
$x = posOfArrayWithinArray $b $a
}
关于Powershell 二进制 grep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62400436/
我有一个文件 test.log。非常大的日志文件。它有不同级别的日志记录。例如,trace , debug , info , warning和 error . 显然trace级别消息只是高速发送垃圾邮
我正在经历一些事情,发现了我无法理解的事情, grep -v grep 这意味着什么?我知道 -v 开关将选择所有不匹配的行。但为什么是第二个grep? 这是完整的命令: ps -ef | grep
我使用 egrep 输出一些带有平台名称的行: XXX | egrep "i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu
grep退出状态部分报告中的手册: EXIT STATUS The exit status is 0 if selected lines are found, and 1 if not
我试图返回多个字符串的第一次出现,即,我想从以下文本中选择第一次出现 1259、3009 和 1589 的行。 ADWN 1259 11:00 B23 ADWN 3009
我猜它不是 Perl 兼容的正则表达式,因为有一种特殊的 grep具体来说就是 PCRE。什么是grep最相似? grep有什么特别的怪癖吗?我需要知道什么? (我习惯了 Perl 和 PHP 中的
有没有办法让 grep 从与搜索表达式匹配的文件中输出“单词”? 如果我想在多个文件中查找“th”的所有实例,我可以这样做: grep "th" * 但是输出会是这样的(粗体是我写的); some-t
我有许多(近 100 个)大 csv 文件,第一列中有 sellID。我知道某些 sellID 在 2 个或更多文件中重复 2 次或多次。是否可以使用 grep 找到所有重复的 sellID(创建映射
我有一个文件中的文件列表。该列表很大,并且文件名是非标准的:这意味着有些文件包含空格、非 ASCII 字符、引号、单引号... 因此,将庞大的文件列表作为参数传递给 grep 并不是一种选择: 因为我
我想在 shell 脚本中使用 grep 和两个变量 var = match cat list.txt | while read word_from_list; do grep "$word_
我有一个大文件,其中每一行都包含一个子字符串,例如 ABC123。如果我执行 grep ABC file.txt 或 grep ABC1 file.txt 我按预期返回这些行,但如果我执行 grep
当我执行以下 grep 时,我得到的结果我无法向自己解释: host:/usr/local/tomcat > grep '-XX:PermSize=256m' * RELEASE-NOTES:
这个问题在这里已经有了答案: grep recursively for a specific file type on Linux (5 个回答) 关闭4年前。 要在子目录中查找所有带有 .out 扩
有什么方法可以让我在搜索某些东西时使用 grep 忽略某些文件,相当于 svnignore 或 gitignore 的东西?我通常在搜索源代码时使用类似的东西。 grep -r something *
有没有办法让 grep 从匹配搜索表达式的文件中输出“单词”? 如果我想在多个文件中找到“th”的所有实例,我可以这样做: grep "th" * 但是输出会是这样的(粗体是我的); some-tex
我是 awk/sed 的完全菜鸟,所以如果我在这里遗漏了一些明显的东西,请原谅我。 基本上我正在尝试做一个嵌套的 grep,即类似于: grep $value `exim -Mvh $(`exim -
我正在尝试编写下载 node.js source 的脚本和 corresponding SHASUMS256.txt ,校验和,grep OK,不返回任何结果,使用 grep 的 -q 标志成功退出代
在 grep "str"* 这是否意味着 grep 执行 grep 的所有内容? 那么 grep -r "str". 的结果比前一个多 最佳答案 当您运行 grep str * 时,shell 将扩展
我正在尝试 grep 文件以查找匹配项的确切出现,但我也得到了更长的虚假匹配项: grep CAT1717O99 myfile.txt -F -w 输出: CAT1717O99 CAT1717O99
我有一个文件,其中包含我希望通过未指定分析运行的标识符(每行一个)。如果一切运行正常,分析将输出具有相同标识符的另一个列表(不一定按相同顺序)。 然而,事实证明,对某些输入标识符没有进行分析,并且这些
我是一名优秀的程序员,十分优秀!