Powershell, преобразование структуры pinvoke в байтовый массив - PullRequest
1 голос
/ 20 мая 2019

У меня есть сценарий powershell с добавленным типом:

Add-Type -TypeDefinition @'
{
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    [Serializable]
    public struct  md_size {
                [MarshalAs(UnmanagedType.U4)]  public uint md_type;
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]  public byte[] md_data;
            } ;
}
...'

Мне нужно преобразовать это в байтовый массив, чтобы отправить его по проводам.

Я пытался использоватьBinaryFormatter:

$in = ... (object of type md_size)
$mstr = New-Object System.IO.MemoryStream
$fmt = New-Object System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
$fmt .Serialize($mstr , $in)
$result = $mstr.GetBuffer()

И я ожидаю получить массив размером 260 обратно, но получу размер 256, который я не совсем понимаю.

Как я могу преобразоватьмоя структура в массиве byte []?

1 Ответ

0 голосов
/ 21 мая 2019

Если я запускаю вашу md_size структуру через BinaryFormatter, как в вашем примере, я получаю 405 байт вывода, не уверен, почему вы видите только 256 - попробуйте снова вызвать GetBuffer() и посмотреть, есть ли еще.

Если вы просто хотите побайтную копию значения структуры, вы можете выделить область памяти с маршализацией, затем скопировать в нее значение структуры и, наконец, скопировать его в байтовый массив, как в этот ответ :

$Marshal = [System.Runtime.InteropServices.Marshal]

try {
  # Calculate the length of the target array
  $length  = $Marshal::SizeOf($in)
  $bytes   = New-Object byte[] $length

  # Allocate memory for a marshalled copy of $in
  $memory  = $Marshal::AllocHGlobal($length)
  $Marshal.StructureToPtr($in, $memory, $true)
  # Copy the value to the output byte array
  $Marshal.Copy($memory, $bytes, 0, $length)
}
finally {
  # Free the memory we allocated for the struct value
  $Marshal.FreeHGlobal($memory)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...