C#的InteropServices类实现特殊的内存操作

目的:
使用C#语言,
如何将一段buffer方便地转换为一个结构体?反过来转换呢?
如何实现一段字节数组与其他类型数组(如short型)的方便转换?

一、 结构体和字节数组互换

参考:

1.1 结构体转换为字节数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static byte[] StructToBytes(object structObj)
{
int size = Marshal.SizeOf(structObj);
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.StructureToPtr(structObj, buffer, false);
byte[] bytes = new byte[size];
Marshal.Copy(buffer, bytes, 0, size);
return bytes;
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}

1.2 字节数组转换为结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static object BytesToStruct(byte[] bytes, int startIndex, Type strcutType)
{

int size = Marshal.SizeOf(strcutType);
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(bytes, startIndex, buffer, size);
return Marshal.PtrToStructure(buffer, strcutType);
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}

二、相同buffer,不同数据类型

定义一个可按字节数组或short数组存取数据的结构体:

1
2
3
4
5
6
7
8
[StructLayout(LayoutKind.Explicit, Pack = 2)]//Pack表示最小移动为2字节
public struct AudioDataBuffer
{
[FieldOffset(0)]
public byte[] ByteData;
[FieldOffset(0)]
public short[] ShortData;
}

调用:

1
2
3
4
5
6
7
8
9
10
11
12
public  class Program
{
static void Main(string[] args)
{

AudioDataBuffer Data=new AudioDataBuffer();
Data.ByteData=new byte[1000];
Data.ByteData[0]=1;
Data.ByteData[1]=1;
Console.Write(Data.ShortData[0]);
Console.ReadKey();
}
}

输出结果为:257,即1 0000 0001。

热评文章