c# 结构体struct包含数与byte类型的转换(一)
2012-05-05 19:03
471 查看
对与c#中结构体 struct 和byte类型的数组之间的相互转换可以参照 http://kb.cnblogs.com/a/1685137/
代码贴在下面
注 在使用之前要设置编译器可以使用unsafe的状态 可以参考 http://blog.csdn.net/csskysea/article/details/6970402
![](http://my.csdn.net/uploads/201205/05/1336215290_7558.png)
比如
按照上面的结构体带到刚才的代码中是回报错的:不能访问托管对象、不能得到结构体的大小
而c#又不允许在结构体内部定义数组的大小,所以恢搞的很头痛。。。。。。。。。
下一篇继续
代码贴在下面
注 在使用之前要设置编译器可以使用unsafe的状态 可以参考 http://blog.csdn.net/csskysea/article/details/6970402
![](http://my.csdn.net/uploads/201205/05/1336215290_7558.png)
using System.Runtime.InteropServices; #region 需要转换的结构 [StructLayout(LayoutKind.Sequential, Pack=1)]//struTest变量在内存中的对齐方式 (指针类型转换成功的必要条件) public struct struTest{ public int intId; public int intName; public DateTime dtBegintime; } #endregion /// <summary> /// xamConverter 的摘要说明。 特定结构变量和byte[]之间的转换操作 /// author:xam /// date:2007-4-23 /// note:apply convertion functions to deal with convertion between struct value and byte [] value; /// </summary> public class xamConverter { #region 构造函数 public xamConverter() { // // TODO: 在此处添加构造函数逻辑 // } #endregion #region 方式一 通过指针类型的强制转换 #region 结构变量到byte[]的转换 /// <summary> /// 结构变量到byte[]的转换 /// </summary> /// <param name="s">结构变量</param> /// <returns>byte[](已分配空间)</returns> public unsafe byte[] xamStructToBytes( struTest s ) { byte[] arr = new byte[ sizeof(struTest) ]; fixed( byte* parr = arr ) { *((struTest*)parr) = s; } return arr; } #endregion #region byte[] 到结构变量的转换 /// <summary> /// byte[] 到结构变量的转换 /// </summary> /// <param name="arr">byte[]</param> /// <returns>结构变量</returns> public unsafe struTest xamBytesToStruct( byte[] arr ) { if( arr.Length < sizeof(struTest) ) throw new ArgumentException(); struTest s; fixed( byte* parr = arr ) { s = *((struTest*)parr); } return s; } #endregion #region 结构变量数组到byte[]的转换 /// <summary> /// 结构变量数组到byte[]的转换 /// </summary> /// <param name="s">结构变量数组</param> /// <param name="tSize">结构变量数组的大小</param> /// <returns>byte[]</returns> public unsafe byte[] xamStructToBytes( struTest[] s,int tSize ) { int i; byte[] arr = new byte[ sizeof(struTest)*tSize ]; for(i=0;i<tSize;i++){ fixed( byte* parr = arr ) { (((struTest*)parr)[i]) = s[i]; } } return arr; } #endregion #region byte[] 到结构变量数组的转换 /// <summary> /// byte[] 到结构变量数组的转换 /// </summary> /// <param name="arr">byte[]</param> /// <param name="tSize">byte[]包含的结构变量数组的大小</param> /// <returns></returns> public unsafe struTest[] xamBytesToStruct( byte[] arr,int tSize ) { if( arr.Length < sizeof(struTest)*tSize ) throw new ArgumentException(); int i; struTest[] s = new struTest[tSize]; for(i=0;i<tSize;i++){ fixed( byte* parr = arr ) { s[i] = (((struTest*)parr)[i]); } } return s; } #endregion #endregion #region 方式二 #region 结构变量到byte[]的转换 /// <summary> /// 结构变量到byte[]的转换 /// </summary> /// <param name="s">结构变量</param> /// <returns>byte[](已分配空间)</returns> public unsafe byte[] xamStructToBytesB( struTest s ) { int size = Marshal.SizeOf(s); System.IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(s, ptr,true); byte[] ba=new byte[size]; Marshal.Copy(ptr, ba, 0, ba.Length ); return ba; } #endregion #region byte[] 到结构变量的转换 /// <summary> /// byte[] 到结构变量的转换 /// </summary> /// <param name="arr">byte[]</param> /// <returns>结构变量</returns> public unsafe struTest xamBytesToStructB( byte[] arr ) { struTest struReturn=new struTest(); int size = Marshal.SizeOf(struReturn); System.IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.Copy(arr,0,ptr,arr.Length); struReturn = (struTest)Marshal.PtrToStructure(ptr,struReturn.GetType()); return struReturn; } #endregion #region 结构变量数组到byte[]的转换 /// <summary> /// 结构变量数组到byte[]的转换 /// </summary> /// <param name="s">结构变量数组</param> /// <param name="tSize">结构变量数组的大小</param> /// <returns>byte[]</returns> public unsafe byte[] xamStructToBytesB( struTest[] s,int tSize ) { int i; int size = Marshal.SizeOf(s[0])*s.Length; System.IntPtr [] ptrs = new IntPtr[s.Length]; for(i=0;i<tSize;i++){ ptrs[i] = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(s[i], ptrs[i],true); } byte[] ba=new byte[size]; for(i=0;i<tSize;i++){ Marshal.Copy(ptrs[i], ba, i*Marshal.SizeOf(s[0]), Marshal.SizeOf(s[0]) ); } return ba; } #endregion #region byte[] 到结构变量数组的转换 /// <summary> /// byte[] 到结构变量数组的转换 /// </summary> /// <param name="arr">byte[]</param> /// <param name="tSize">byte[]包含的结构变量数组的大小</param> /// <returns></returns> public unsafe struTest[] xamBytesToStructB( byte[] arr,int tSize ) { if( arr.Length < sizeof(struTest)*tSize ) throw new ArgumentException(); struTest[] struReturn=new struTest[tSize]; int intUnitSize = Marshal.SizeOf(struReturn[0]); int size = intUnitSize*tSize; int i;int intTemp; System.IntPtr [] ptrs = new IntPtr[tSize]; for(i=0;i<tSize;i++){ intTemp = i*intUnitSize; ptrs[i] = Marshal.AllocHGlobal(size); Marshal.Copy(arr,intTemp,ptrs[i],intUnitSize); struReturn[i] = (struTest)Marshal.PtrToStructure(ptrs[i],struReturn[i].GetType()); } return struReturn; } #endregion #endregion } 使用unsafe code 不安全代码选项需打开 演示 #region 结构数组测试 xamConverter xc = new xamConverter(); struTest[] st = new struTest[3]; st[0].intId = 1; st[0].intName = 12; st[0].dtBegintime = DateTime.Now; st[2].intId = 2; st[2].intName = 232; st[2].dtBegintime = DateTime.Now; byte [] inputBytes = xc.xamStructToBytesB(st,3); struTest[] st2 = xc.xamBytesToStructB(inputBytes,3); MessageBox.Show(st2[2].dtBegintime.ToString() + " = " + st2[2].intName.ToString()); #endregion以上的实现相对比较简单,但是很多时候结构体不是那个样子的
比如
public struct struTest { public int[] data; public int[] fft; };
按照上面的结构体带到刚才的代码中是回报错的:不能访问托管对象、不能得到结构体的大小
Marshal.SizeOf();函数会报错
而c#又不允许在结构体内部定义数组的大小,所以恢搞的很头痛。。。。。。。。。
下一篇继续
相关文章推荐
- c# 结构体struct包含数与byte类型的转换(二)
- (一)一个工作任务引起的乱战——c#中结构体与byte[]间相互转换
- C# 之 结构体(struct)---复合类型的数据结构
- c#结构体和byte[]之间的转换
- C#中string和byte[]类型的转换
- C# string类型和byte[]类型相互转换
- C# byte[]类型和String类型相互转换
- C#中struct的字节对齐、转换操作和复制为二进制数据(byte[])
- C#中struct的字节对齐、转换操作和复制为二进制数据(byte[])
- c# struct 变量 到 byte[] 变量的转换操作
- c#中的char byte string 类型之间的转换
- C# string类型和byte[]类型相互转换
- C#中将DateTime类型转换成Byte数组
- C# 与 C++ 数据类型比较及结构体转换
- C#实现字符串转换到16进制byte类型
- C#.NET开发Winform使用MySQL数据库 无法将“System.Byte[]”的对象强制转换为类型“System.IConvertible”
- C#与C++数据类型比较及结构体转换(搜集整理二)
- C# 读取 timestamp 时间戳 值为byte[] 类型时,需要转换成 16进制的字符串 和 数据库中的时间戳值进行比对
- C#调用C++写的dll,包含结构体转换和C#动态调用dll(头文件转换为类)
- C# string类型和byte[]类型相互转换