shortcutfile_utils.bat をこさえるのに PowerShell でバイト列に含まれるバイト列を検索したかった。
Bing 先生に聞くと
「PowerShell Byte[] search」でググると、以下のページが見つかるのだが、検索した範囲だとあまり良い方法が見つからなかったと言うか、そもそもの話 PowerShell の機能にバイト列を最小の労力で扱おうって気持ちが全く感じられない。
[System.BitConverter]::ToString() で XX-XX-XX-...-XX 形式のテキストに変換して $a.IndexOf($b) が正なら ÷ 3 しとく辺りで妥協したのが以下のコード。
バイト列の置換も for 文グルグルで妥協って、クソダサイな。
書いてて爽快感が全然ないんだが、もっと良い方法ないのか?
Bing 先生に聞くと
Q: PowerShell で Byte[] 型のデータ $a に含まれる Byte[] 型のデータ $b を検索するにはどうすればよい?
A: こんにちは、これは Bing です。😊 PowerShell で Byte[] 型のデータ $a に含まれる Byte[] 型のデータ $b を検索するには、次のような方法があります。 - IndexOf メソッドを使用して、$a から $b の最初の出現位置を取得する³。例えば、`$a.IndexOf($b)` とすると、$b が $a の何番目の要素から始まるかを返します。見つからない場合は -1 を返します。 - Compare メソッドを使用して、$a と $b の部分的な比較を行う³。例えば、`[System.BitConverter]::Compare($a, 0, $b, 0, $b.Length)` とすると、$a の最初の要素から $b の長さ分だけ $b と比較します。一致する場合は 0 を返します。 - Convert メソッドを使用して、$a と $b を文字列に変換してから、文字列の検索メソッドを使用する³。例えば、`[System.Text.Encoding]::UTF8.GetString($a).Contains([System.Text.Encoding]::UTF8.GetString($b))` とすると、$a に $b が含まれているかどうかを真偽値で返します。 これらの方法の詳細については、[System.BitConverter](https://docs.microsoft.com/ja-jp/dotnet/api/system... クラスや [System.Text.Encoding](https://docs.microsoft.com/ja-jp/dotnet/api/system... クラスのドキュメントを参照してください。 Source: Conversation with Bing, 2023/6/2 (1) arrays - Creating Byte[] in PowerShell - Stack Overflow. https://stackoverflow.com/questions/17474131/creat... (2) 配列について知りたかったことのすべて - PowerShell | Microsoft .... https://learn.microsoft.com/ja-jp/powershell/scrip... (3) 種類 - PowerShell | Microsoft Learn. https://learn.microsoft.com/ja-jp/powershell/scrip...||=とか、
Q: [System.Byte[]] 型の配列 $a から、$a よりも短い [System.Byte[]] 型の配列 $b の出現位置を調べる方法は?
A: [System.Byte[]] 型の配列 $a から、$a よりも短い [System.Byte[]] 型の配列 $b の出現位置を調べる方法は、正規表現を使うことができます²。例えば、次のように書けます。 ```powershell # バイナリファイルを読み込む $a = [System.IO.File]::ReadAllBytes("test.bin") # 検索するバイナリデータを作成する $b = [byte]0x41,0x42,0x43 # バイナリデータを16進数の文字列に変換する $hex = [System.BitConverter]::ToString($b) -replace '-','\\x' # 正規表現で検索する if ($a -match $hex) { # 検索に成功した場合の処理 Write-Host "Found $b at index $($Matches.Index)" } else { # 検索に失敗した場合の処理 Write-Host "Not found" } ``` 以上の方法で、[System.Byte[]] 型の配列 $a から、$a よりも短い [System.Byte[]] 型の配列 $b の出現位置を調べることができます。 Source: Conversation with Bing, 2023/6/2 (1) Use PowerShell and Regular Expressions to Search Binary Data. https://devblogs.microsoft.com/scripting/use-power... (2) Array.Find on powershell array - Stack Overflow. https://stackoverflow.com/questions/21209946/array... (3) PowerShell: Byte arrays - René Nyffenegger. https://www.renenyffenegger.ch/notes/Windows/Power...みたいなことを言ってくるんだけど、お前、それ幻覚なんじゃ!?
「PowerShell Byte[] search」でググると、以下のページが見つかるのだが、検索した範囲だとあまり良い方法が見つからなかったと言うか、そもそもの話 PowerShell の機能にバイト列を最小の労力で扱おうって気持ちが全く感じられない。
- raddit / 2017-11-07: Search byte array for byte pattern
- stackoverflow / 2020-06-16: Powershell binary grep
[System.BitConverter]::ToString() で XX-XX-XX-...-XX 形式のテキストに変換して $a.IndexOf($b) が正なら ÷ 3 しとく辺りで妥協したのが以下のコード。
バイト列の置換も for 文グルグルで妥協って、クソダサイな。
書いてて爽快感が全然ないんだが、もっと良い方法ないのか?
タグ
コメントをかく