面倒だったのでメモ
やりたいことは、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;
}
#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;
}
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 件のコメント:
コメントを投稿