在PowerShell中创建Byte []

And*_*der 20 arrays 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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

我想要做的是将$ bytes转换为与$ r.data相同的类型.由于某种原因,$ bytes被创建为Object [].如何将其转换为Byte []?

Slo*_*ire 24

这个答案是针对没有背景的问题.我正在添加它,因为搜索结果.

[System.Byte[]]::CreateInstance([System.Byte],<Length>)
Run Code Online (Sandbox Code Playgroud)

  • @Andrew,你是对的.我已经纠正过了. (2认同)

Ans*_*ers 17

将其转换为字节数组:

[byte[]]$bytes = Get-Content $file -Encoding byte
Run Code Online (Sandbox Code Playgroud)


And*_*rew 17

在PS 5.1中,这个:

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

不适合我.所以相反,我做了:

new-object byte[] 4

这导致了一个空字节[4]:

0
0
0
0
Run Code Online (Sandbox Code Playgroud)

  • 试试 [byte[]]::new(4) (2认同)

Yen*_*ang 15

可能还有更多的方法,但这些是我能想到的:

直接数组初始化:

[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
Run Code Online (Sandbox Code Playgroud)

创建一个零初始化数组

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

如果你想要一个byte[](二维数组)的数组

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

此外:

# 3-D
[byte[,,]] $b = [byte[,,]]::new(5,5,5)
[byte[,]] $b = [System.Array]::CreateInstance([byte],5,5,5)
Run Code Online (Sandbox Code Playgroud)