Подтвердить что ты не робот

Создание байта [] в PowerShell

У меня есть код PowerShell, который использует COM API. Я получаю ошибку несоответствия типа, когда я передаю массив байтов. Вот как я создаю массив, а также некоторую информацию о типе

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.

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 создается как объект []. Как я могу передать его байту []?

4b9b3361

Ответ 1

Передача его в массив байтов:

[byte[]]$bytes = Get-Content $file -Encoding byte

Ответ 2

Этот ответ касается вопроса без контекста. Я добавляю его из-за результатов поиска.

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

Ответ 3

В PS 5.1 это:

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

не работал у меня. Поэтому вместо этого я сделал:

new-object byte[] 4

в результате которого был пуст [4]: ​​

0
0
0
0

Ответ 4

Возможно, есть даже больше способов, но я могу подумать о следующих:

Прямая инициализация массива:

[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-D массив)

# 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)