如何将文件中的字节与值的文字数组进行比较?
$path = "C:\BinaryFile.bin"
$bytes = Get-Content -LiteralPath $path -Encoding byte -TotalCount 4 -ReadCount 4
if ($bytes -eq [0 1 2 3]) { # How to compare to expected bytes?
Write-Output "OK: $bytes"
}
字符串
如何将文件中的字节与值的文字数组进行比较?
$path = "C:\BinaryFile.bin"
$bytes = Get-Content -LiteralPath $path -Encoding byte -TotalCount 4 -ReadCount 4
if ($bytes -eq [0 1 2 3]) { # How to compare to expected bytes?
Write-Output "OK: $bytes"
}
字符串
4条答案
按热度按时间lb3vh1jj1#
可能是比较对象。没有输出意味着相等。同步窗口0表示精确顺序。
字符串
或者做一个字符串比较:
型
tyu7yeag2#
PowerShell没有内置的序列相等运算符,但您可以编写适合此目的的小实用程序函数:
字符串
现在您可以:
型
uxh89sit3#
其他答案提供了有用的解决方案,可以使用 any 类型的数组。
这里有一个适用于您的情况的快捷方式,它将数组 * 作为字符串 * 进行比较,利用PowerShell stringifies 数组的方式(请参阅下面的限制**):
字符串
限制:
PowerShell通过将数组的(字符串化的)元素与空格连接起来来串化数组;例如,
$bytes = 0x1, 0x2, 0xA; "$bytes"
成为一个具有逐字值1 2 10
的字符串(注意如何使用数字的 decimal 表示)。因此,通过它们的(PowerShell)字符串表示比较数组只有在满足以下条件的情况下才能 * 鲁棒地 * 工作:
如果元素是 * 字符串 *,并且您希望区分大小写 * 比较它们,请使用
-ceq
代替-eq
LINQ解决方案
此解决方案基于
System.Linq.Enumerable.SequenceEqual()
,适用于所有类型。注意需要
[byte[]]
强制转换--它创建输入数组的强类型 * 副本 *(它们本身是[object[]]
类型的)--以便方法调用工作:型
Compare-Object
和-eq
运算符执行的PowerShell相等测试更严格:值得注意的是,默认情况下,字符串元素比较时区分大小写。如果您选择[object[]]
作为上述类型转换-以避免创建 * 副本 * 具有相同值的数字只有在它们的类型完全相同时才被认为是相等的;值得注意的是,数组字面量1, 2, 3
创建了一个具有[int]
值的[object[]]
数组,而不是[byte]
值。从好的方面来说,LINQ的使用有可能比
Compare-Object
解决方案执行得更好-有关更多信息,请参阅this answer的底部部分。6rqinv9w4#
数组可以通过
Compare-Object
进行比较。它读取文件的前四(4)个字节,并将其与文字数组进行比较。在Windows PowerShell 5.1中:
字符串
在PowerShell Core 6.x+中:
型
范例:
型