C#ではC言語などで普通に使っているポインタ操作の類が使え事は使えるのですが基本的には推奨されない手法となっています。

言語構造的にも堅過ぎるJavaをWindows上にて使いやすくするためVB寄りに修正してあるような感じになってます。

C#だけでコーディングしてるときはポインタ操作は使う事はあまりないのですが

ハードウェア操作や外部DLL、Win32APIへのアクセスなどが絡むとどうしてもバッファ操作・ポインタ操作が必要になってきます。

そんな時に「void *」のC#型として使われるのが「IntPtr」とゆう型なんですが、名前の通り「int型バッファへのポインター」として動くのですよね。

そんなわけで実際に使う場合にはそのままキャストして読み出しとはいきません。

感覚的にも判りづらいのうえに、すぐ忘れそう・・・

・IntPtr → int[]

IntPtr buffer = new IntPtr();
int size = 配列MAX

int ws = sizeof(int);

buffer = Marshal.AllocHGlobal(size);
int[] result = new int[size / ws];
Marshal.Copy(buffer, result, 0, size / ws);
Marshal.FreeHGlobal(buffer);

・IntPtr → string (ASCII文字列)

IntPtr buffer = new IntPtr();
int size = 文字列最大長
buffer = Marshal.AllocHGlobal(size);
string result = “”;
result = Marshal.PtrToStringAnsi(buffer).SubString(size);;
Marshal.FreeHGlobal(buffer);

・IntPtr → Int16 (Short/WORD)

IntPtr buffer = new IntPtr();
int size = 配列MAX
buffer = Marshal.AllocHGlobal(size);
Int16 result = “”;
result = Marshal.ReadInt16(buffer);
Marshal.FreeHGlobal(buffer);

※リトルエンディアンでBYTE[2]からWORDに変換されます。

DWORDへは Int16をInt32にすればOK