请问:
C#中结构体数组能不能当作一个类,还是需要把它分成许多结构体一一进行操作?比如:
[StructLayout(LayoutKind.Sequential, Pack = 4)]
struct A
{..}A a;Marshal.SizeOf(a);
Marshal.SizeOf(typeof(A));
以上两种方法都可求出结构体大小。那么现在:
A[]aa=new A[16];那么:
Marshal.SizeOf(aa);
Marshal.SizeOf(typeof(A[]));这两种方式是否可以求出结构体数组的大小?因为我用的一些函数是对结构体进行操作,我想把它们也用在结构体数组上。如有兴趣您可看下这两个函数:
//结构体复制入byte数组
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;
}
//byte数组复制入结构体
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;
}
C#中结构体数组能不能当作一个类,还是需要把它分成许多结构体一一进行操作?比如:
[StructLayout(LayoutKind.Sequential, Pack = 4)]
struct A
{..}A a;Marshal.SizeOf(a);
Marshal.SizeOf(typeof(A));
以上两种方法都可求出结构体大小。那么现在:
A[]aa=new A[16];那么:
Marshal.SizeOf(aa);
Marshal.SizeOf(typeof(A[]));这两种方式是否可以求出结构体数组的大小?因为我用的一些函数是对结构体进行操作,我想把它们也用在结构体数组上。如有兴趣您可看下这两个函数:
//结构体复制入byte数组
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;
}
//byte数组复制入结构体
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;
}
解决方案 »
- gridview 读取的包含链接地址的字段 不能点击
- 我在我的机器上。发布站点了。但是为什么别人访问不到我建的站点
- C# 中API函数 SetWinEventHook的使用
- 在线= 急.大侠们帮下忙 ,刚从ASP.NET转到WINAPP ....C#中引用C++的DLL 访问的内存受保护...
- 水晶报表显示图片问题(winform)
- [90吉利] 请问在Main方法赋值,如何在其它类里引用
- 要处理此请求,必须在配置中注册 WebResource.axd 处理程序
- 怎么历遍一个窗体所有字控件,然后得到自己想要控件的句柄?
- 画图问题 求大神帮忙改改 对画图了解甚微啊
- C#程序要求类、实现、Main()等都放在一个文件中,要是开发中大型软件文件太长怎么办?
- 发现一个酷站,散点分
- windows 控件库、web控件库、以及组件类的区别
Marshal.SizeOf(Type);
没有规定不可以是Array类型
一个简单的方式是先structObj.getType().IsArray()判断是不是数组,如果是获取数组里的各个Type的length
加起来。
C#中结构体数组能不能当作一个类,还是需要把它分成许多结构体一一进行操作? 比如:
[StructLayout(LayoutKind.Sequential, Pack = 4)]
struct A
{..} A a; Marshal.SizeOf(a);
Marshal.SizeOf(typeof(A));
以上两种方法都可求出结构体大小。 那么现在:
A[]aa=new A[16]; 那么:
Marshal.SizeOf(aa);
Marshal.SizeOf(typeof(A[])); 这两种方式是否可以求出结构体数组的大小?因为我用的一些函数是对结构体进行操作,我想把它们也用在结构体数组上。 如有兴趣您可看下这两个函数:
//结构体复制入byte数组
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;
}
//byte数组复制入结构体
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;
}
copy for have a look
[StructLayout(LayoutKind.Sequential, Pack = 4)]
struct A
{..}
A[]aa=new A[16]; 那么:
Marshal.SizeOf(aa); //失败!Marshal.SizeOf(typeof(A[])); //失败!我采用的方法是:把数组包装到一个结构里,然后求结构的大小,虽然成功但多加了一层,不知有没更好方法?
"你的目的是网络传输还是P/Invoke?"都不是,是文件操作。将自定义格式数据写入或从文件读出。以前VC下用CopyMemory通杀(内存映射文件),而在C#下则"处处受制",当然安全性是没得说。要想使用那两个函数,看来只能采用把数组包装到一个结构里的方法了。另外说明一下,使用C#数组类不行,因为我无法控制其内存结构。