Ответ 1
Передача его в массив байтов:
[byte[]]$bytes = Get-Content $file -Encoding byte
У меня есть код 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 создается как объект []. Как я могу передать его байту []?
Передача его в массив байтов:
[byte[]]$bytes = Get-Content $file -Encoding byte
Этот ответ касается вопроса без контекста. Я добавляю его из-за результатов поиска.
[System.Byte[]]::CreateInstance([System.Byte],<Length>)
В PS 5.1 это:
[System.Byte[]]::CreateInstance(<Length>)
не работал у меня. Поэтому вместо этого я сделал:
new-object byte[] 4
в результате которого был пуст [4]:
0
0
0
0
Возможно, есть даже больше способов, но я могу подумать о следующих:
Прямая инициализация массива:
[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)