我有一个添加了类型的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 []数组?
答案 0 :(得分:0)
如果我通过md_size
运行您的BinaryFormatter
结构,如您的示例所示,将得到405字节的输出,不确定是否只看到256
的原因-尝试调用GetBuffer()
再次查看是否还有更多。
如果您只想要逐字节复制struct值,则可以分配一个编组的内存区域,然后将struct值复制到该区域,最后从那里复制到一个字节数组,如{{3 }}:
$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)
}