2015年12月2日水曜日

C#で配列を構造体へコピー

C#で配列を構造体にコピーしたいだけなのに
面倒だったのでメモ

やりたいことは、Cでこんな感じ

#include<stdio.h>
#include<string.h>

struct Hoge{
  char a[6];
  char b[4];
};

int main(){
  char src[10];
  struct Hoge dst;
  src[9] = 127;
  memcpy(&dst,src,sizeof(struct Hoge));
  printf("%d\n",dst.b[3]);  //127
  return 0;
}

C#だとこんな感じ。面倒だ。
コンパイル時は、/unsefe  オプションをつける。

using System;
using System.Runtime.InteropServices;

class Test
{
  unsafe struct Hoge
  {
public fixed byte a[6];
public fixed byte b[4];
  }

  unsafe public static int Main()
  {
byte[] src;
Hoge dst;
src = new byte[10];
src[9] = 127;
//srcのポインタを取得
GCHandle gch = GCHandle.Alloc(src,GCHandleType.Pinned);
IntPtr ptr = gch.AddrOfPinnedObject();
//srcのコピー
dst = (Hoge)Marshal.PtrToStructure(ptr,typeof(Hoge));
gch.Free();
System.Console.WriteLine(dst.b[3]); //127
return 0;
  }
  

0 件のコメント:

コメントを投稿