PowerShell のバイト配列

Salman Mehmood 2023年6月20日
  1. PowerShell でデータをバイト配列に変換する
  2. PowerShell 5+ でデータをバイト配列に変換する
  3. PowerShell 7+ でデータをバイト配列に変換する
  4. PowerShell でバイト配列を文字列に変換する
  5. 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 であることを確認してください。 そうしないと、変換によって重要なデータが失われる可能性があります。

著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

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

関連記事 - PowerShell Array