(内容转自http://www.cnblogs.com/sunrack/articles/1244096.html)
一、C++
class
BusinessData
{
public :
int x;
int test[ 3 ];
double y;
char str[ 3 ];
char t;
char strName[5];
};
{
public :
int x;
int test[ 3 ];
double y;
char str[ 3 ];
char t;
char strName[5];
};
int
_tmain(
int
argc, _TCHAR
*
argv[])
{
BusinessData curBusinessData;
curBusinessData.x = 5 ;
curBusinessData.y = 7.123468 ;
curBusinessData.t = ' T ' ;
for ( int i = 0 ; i < 3 ; i ++ )
{
curBusinessData.test[i] = i + 1 ;
}
curBusinessData.str[ 0 ] = ' a ' ;
curBusinessData.str[ 1 ] = ' b ' ;
curBusinessData.str[ 2 ] = ' /0 ' ;
strcpy(curBusinessData.strName,"测试");
ofstream fout( " C://file.dat " , ios::binary);
fout.write(( char * )( & curBusinessData), sizeof (curBusinessData));
fout.close();
return 0 ;
}
{
BusinessData curBusinessData;
curBusinessData.x = 5 ;
curBusinessData.y = 7.123468 ;
curBusinessData.t = ' T ' ;
for ( int i = 0 ; i < 3 ; i ++ )
{
curBusinessData.test[i] = i + 1 ;
}
curBusinessData.str[ 0 ] = ' a ' ;
curBusinessData.str[ 1 ] = ' b ' ;
curBusinessData.str[ 2 ] = ' /0 ' ;
strcpy(curBusinessData.strName,"测试");
ofstream fout( " C://file.dat " , ios::binary);
fout.write(( char * )( & curBusinessData), sizeof (curBusinessData));
fout.close();
return 0 ;
}
二、C#
[StructLayoutAttribute(LayoutKind.Sequential, CharSet
=
CharSet.Ansi, Pack
=
0
)]
public class BusinessData
{
// [FieldOffset(0)]
// [MarshalAs(UnmanagedType.I4)]
public int x;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3 )]
public int [] test;
// [FieldOffset(8)]
// [MarshalAs(UnmanagedType.R8)]
public double y;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 3 )]
public string str;
// [FieldOffset(2)]
public char t;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
public string strName;
};
public class BusinessData
{
// [FieldOffset(0)]
// [MarshalAs(UnmanagedType.I4)]
public int x;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3 )]
public int [] test;
// [FieldOffset(8)]
// [MarshalAs(UnmanagedType.R8)]
public double y;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 3 )]
public string str;
// [FieldOffset(2)]
public char t;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
public string strName;
};
/**/
///
<summary>
/// 结构体转byte数组
/// </summary>
/// <param name="structObj"> 要转换的结构体 </param>
/// <returns> 转换后的byte数组 </returns>
public static byte [] StructToBytes( object structObj)
{
// 得到结构体的大小
int size = Marshal.SizeOf(structObj);
// 创建byte数组
byte [] bytes = new byte [size];
// 分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
// 将结构体拷到分配好的内存空间
Marshal.StructureToPtr(structObj, structPtr, false );
// 从内存空间拷到byte数组
Marshal.Copy(structPtr, bytes, 0 , size);
// 释放内存空间
Marshal.FreeHGlobal(structPtr);
// 返回byte数组
return bytes;
}
/**/ /// <summary>
/// byte数组转结构体
/// </summary>
/// <param name="bytes"> byte数组 </param>
/// <param name="type"> 结构体类型 </param>
/// <returns> 转换后的结构体 </returns>
public static object BytesToStuct( byte [] bytes,Type type)
{
// 得到结构体的大小
int size = Marshal.SizeOf(type);
// byte数组长度小于结构体的大小
if (size > bytes.Length)
{
// 返回空
return null ;
}
// 分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
// 将byte数组拷到分配好的内存空间
Marshal.Copy(bytes, 0 ,structPtr,size);
// 将内存空间转换为目标结构体
object obj = Marshal.PtrToStructure(structPtr, type);
// 释放内存空间
Marshal.FreeHGlobal(structPtr);
// 返回结构体
return obj;
}
/// 结构体转byte数组
/// </summary>
/// <param name="structObj"> 要转换的结构体 </param>
/// <returns> 转换后的byte数组 </returns>
public static byte [] StructToBytes( object structObj)
{
// 得到结构体的大小
int size = Marshal.SizeOf(structObj);
// 创建byte数组
byte [] bytes = new byte [size];
// 分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
// 将结构体拷到分配好的内存空间
Marshal.StructureToPtr(structObj, structPtr, false );
// 从内存空间拷到byte数组
Marshal.Copy(structPtr, bytes, 0 , size);
// 释放内存空间
Marshal.FreeHGlobal(structPtr);
// 返回byte数组
return bytes;
}
/**/ /// <summary>
/// byte数组转结构体
/// </summary>
/// <param name="bytes"> byte数组 </param>
/// <param name="type"> 结构体类型 </param>
/// <returns> 转换后的结构体 </returns>
public static object BytesToStuct( byte [] bytes,Type type)
{
// 得到结构体的大小
int size = Marshal.SizeOf(type);
// byte数组长度小于结构体的大小
if (size > bytes.Length)
{
// 返回空
return null ;
}
// 分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
// 将byte数组拷到分配好的内存空间
Marshal.Copy(bytes, 0 ,structPtr,size);
// 将内存空间转换为目标结构体
object obj = Marshal.PtrToStructure(structPtr, type);
// 释放内存空间
Marshal.FreeHGlobal(structPtr);
// 返回结构体
return obj;
}
static
void
Main(
string
[] args)
{
int rawsize = Marshal.SizeOf( typeof (BusinessData));
byte [] buffer = new byte [rawsize];
FileStream curSream = new FileStream( " C://file.dat " , FileMode.Open);
BinaryReader curReader = new BinaryReader(curSream);
curReader.Read(buffer, 0 , rawsize);
object obj = BytesToStuct(buffer, typeof (BusinessData));
BusinessData curBusinessData = (BusinessData)obj;
if (curBusinessData != null )
{
}
}
{
int rawsize = Marshal.SizeOf( typeof (BusinessData));
byte [] buffer = new byte [rawsize];
FileStream curSream = new FileStream( " C://file.dat " , FileMode.Open);
BinaryReader curReader = new BinaryReader(curSream);
curReader.Read(buffer, 0 , rawsize);
object obj = BytesToStuct(buffer, typeof (BusinessData));
BusinessData curBusinessData = (BusinessData)obj;
if (curBusinessData != null )
{
}
}