web-dev-qa-db-ja.com

PowerShellでByte []を作成する

COM APIを使用しているPowerShellコードがあります。バイト配列を渡すと、型の不一致エラーが発生します。これが私が配列を作成する方法といくつかの型情報です

PS C:\> $bytes = Get-Content $file -Encoding byte
PS C:\> $bytes.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array


PS C:\> $bytes[0].GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Byte                                     System.ValueType

APIをいじり回して、基本タイプがSystem.ArrayのByte []を探していることがわかりました。

PS C:\> $r.data.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Byte[]                                   System.Array

PS C:\> $r.data[0].gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Byte                                     System.ValueType

私がやろうとしていることは、$ bytesを$ r.dataと同じ型に変換することです。何らかの理由で、$ bytesはObject []として作成されています。 Byte []に​​キャストするにはどうすればよいですか?

22
Andy Schneider

それをバイト配列にキャストします。

[byte[]]$bytes = Get-Content $file -Encoding byte
17
Ansgar Wiechers

この回答は、文脈のない質問に対するものです。検索結果のために追加しています。

[System.Byte[]]::CreateInstance([System.Byte],<Length>)

PS 5.1では、これ:

[System.Byte[]]::CreateInstance(<Length>)

うまくいきませんでした。だから代わりに私はやった:

new-object byte[] 4

その結果、空のバイトが生じました[4]:

0
0
0
0
19
Andrew

おそらくもっと多くの方法がありますが、これらは私が考えることができるものです:

アレイの直接初期化:

[byte[]] $b = 1,2,3,4,5
$b = [byte]1,2,3,4,5
$b = @([byte]1,2,3,4,5)
$b = [byte]1..5

ゼロで初期化された配列を作成する

$b = [System.Array]::CreateInstance([byte],5)
$b = [byte[]]::new(5)        # Powershell v5+
$b = New-Object byte[] 5
$b = New-Object -TypeName byte[] -Args 5

byte[]の配列が必要な場合(2次元配列)

# 5 by 5
[byte[,]] $b = [System.Array]::CreateInstance([byte],@(5,5)) # @() optional for 2D and 3D
[byte[,]] $b = [byte[,]]::new(5,5)

さらに:

# 3-D
[byte[,,]] $b = [byte[,,]]::new(5,5,5)
[byte[,]] $b = [System.Array]::CreateInstance([byte],5,5,5)
5
YenForYang