请输入您要查询的百科知识:

 

词条 周朔鹏
释义

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

namespace ServerSocket

{

/// <summary>

/// 内存处理,组织内存拓扑结构并定义处理函数

/// 作者:周朔鹏

/// 编写时间:2010-6-10

/// </summary>

public static class PLCStruct

{

//将结构体声明为Struct和class其行为完全一致,但是Struct中不能用new创建对象,class中可以,但是,在此应用中创建对象没有实际价值。

/*[StructLayout(LayoutKind.Sequential, Pack = 1)]

public class Socket_struct

{

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]

public byte[] bByte;// = new byte[20];

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]

public Int32[] dwDword;// = new UInt32[20];

}*/

[StructLayout(LayoutKind.Sequential, Pack = 1)]

public struct Socket_struct

{

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]

public byte[] bByte;

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]

public Int32[] dwDword;

}

}

public class StructToFromByte

{

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数组

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;

}

}

}

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/2/7 19:41:54