PowerShell のバイト配列
- PowerShell でデータをバイト配列に変換する
- PowerShell 5+ でデータをバイト配列に変換する
- PowerShell 7+ でデータをバイト配列に変換する
- PowerShell でバイト配列を文字列に変換する
- PowerShell で文字列をバイト配列に変換する
この記事は、PowerShell Scripting API を使用して、さまざまな形式で存在するデータをバイト配列に変換する方法を示すことを目的としています。
PowerShell でデータをバイト配列に変換する
タスクを自動化し、データを処理する一方で、有用な情報を抽出したり、意味のある方法でデータを変更したりするために、データを特定の方法で処理する必要がある場合があります。 PowerShell でこのようなデータを処理すると、特に別のデータ型では処理が不便になることがあります。
処理を簡単にしたり、処理計算の数を減らしたりするために、データを Byte 配列に変換してから、元のデータの代わりにそれに対して操作を実行することが理想的な場合があります。
次のコードを検討してください。
$data = Get-Content "a.exe"
Get-Item "a.exe" | Format-List -Property * -Force
Write-Host "File Datatype: "$data.GetType().Name
これにより、次の出力が得られます。
< Output redacted >
.
.
.
.
BaseName : a
Target :
LinkType :
Length : 400644
.
.
.
Extension : .exe
Name : a.exe
Exists : True
.
.
.
.
.
Attributes : Archive
File Datatype: Object[]
上記の出力から、開いたファイルは Windows 実行可能 (exe
) ファイルです。 Get-Item
および Format-List
コマンドレットを使用してその属性を調べた後、ファイル、特にサイズに関して意味のある洞察を得ることができ、反復中に非常に役立つことがわかります。
この状況の好ましくない側面の 1つは、Get-Content
コマンドレットを使用して取得したファイル データが Object[]
を返すことです。
シナリオ依存の操作のために、これを Byte[]
に変換する方法を見てみましょう。
PowerShell 5+ でデータをバイト配列に変換する
次のコードを検討してください。
$file = "a.exe"
[byte[]]$data = Get-Content $file -Encoding Byte
Write-Host "File Datatype: "$data.GetType().Name
for($i=0; $i -lt 10; $i++) { Write-Host $data[$i] }
これにより、次の出力が得られます。
File Datatype: Byte[]
Byte No 0 : 77
Byte No 1 : 90
Byte No 2 : 144
Byte No 3 : 0
Byte No 4 : 3
Byte No 5 : 0
Byte No 6 : 0
Byte No 7 : 0
Byte No 8 : 4
Byte No 9 : 0
Byte No 10 : 0
型キャストと -Encoding
パラメータを使用すると、ファイルをバイト配列として直接読み取ることができます。 GetType()
メソッドを使用し、Name
という名前のプロパティにアクセスすることで、結果が本当に Byte 配列であることを確認できます。
データが実際に正しく変換されたことをさらに確認するために、小さな for
ループを記述して、ファイルの一部のバイトを出力できます。
PowerShell 7+ でデータをバイト配列に変換する
次のコードを検討してください。
[byte[]]$data = Get-Content "a.exe" -AsByteStream
Write-Host $data.GetType().Name
これにより、次の出力が得られます。
textByte[]
ほとんどの構文は、バージョン間で同じです。 唯一の違いは、-Encoding Byte
が -AsByteStream
に置き換えられたことです。
PowerShell でバイト配列を文字列に変換する
特定のバイト配列を文字列に変換するのは簡単です。 次のコードを検討してください。
$array = @(0x54,0x68,0x65,0x20,0x6f,0x62,0x6a,0x65,0x63,0x74,0x20,0x6f,0x66,0x20,0x6c,0x69,0x66,0x65,0x20,0x69,0x73,0x20,0x6e,0x6f,0x74,0x20,0x74,0x6f,0x20,0x62,0x65,0x20,0x6f,0x6e,0x20,0x74,0x68,0x65,0x20,0x73,0x69,0x64,0x65,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x6d,0x61,0x6a,0x6f,0x72,0x69,0x74,0x79,0x2c,0x20,0x62,0x75,0x74,0x20,0x74,0x6f,0x20,0x65,0x73,0x63,0x61,0x70,0x65,0x20,0x66,0x69,0x6e,0x64,0x69,0x6e,0x67,0x20,0x6f,0x6e,0x65,0x73,0x65,0x6c,0x66,0x20,0x69,0x6e,0x20,0x74,0x68,0x65,0x20,0x72,0x61,0x6e,0x6b,0x73,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x69,0x6e,0x73,0x61,0x6e,0x65,0x2e)
$string = [System.Text.Encoding]::UTF8.GetString($array)
$string
次の出力が得られます。
The object of life is not to be on the side of the majority but to escape finding oneself in the ranks of the insane.
UTF8.GetString
メソッドを使用すると、UTF8 でエンコードされたバイト配列を文字列表現に戻すことができます。 他のエンコーディング (ASCII など) でこのメソッドを使用すると、異常な結果が生じる可能性があるため、テキストのエンコーディングに注意してください。
PowerShell で文字列をバイト配列に変換する
バイト配列を文字列表現に変換する方法と同様に、文字列もバイト表現に変換できます。
次のコードを検討してください。
$string = "Never esteem anything as of advantage to you that will make you break your word or lose your self-respect."
$bytes = [System.Text.Encoding]::Unicode.GetBytes($string)
Write-Host "First 10 Bytes of String are: "
for($i=0; $i -lt 10; $i++) { Write-Host $bytes[$i] }
これにより、次の出力が得られます。
First 10 Bytes of String are:
78
0
101
0
118
0
101
0
114
0
Unicode.GetBytes
をこの特定のシナリオで使用して、Unicode 文字列のバイトを取得できます。 文字列が Unicode であることを確認してください。 そうしないと、変換によって重要なデータが失われる可能性があります。
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn