专栏首页c#学习笔记C#学习笔记——CopyMemory

C#学习笔记——CopyMemory

Socket接收到的byte []要转换成自定义的struct / 自定义Struct转换成byte []都相当麻烦 用循环去转换太浪费时间了……于是想到用CopyMemory,Google一圈终于搞定 下面的代码是在Snippet Compiler里编译通过的

C#代码 #region Imports using System; using System.IO; using System.Net; using System.Xml; using System.Text; using System.Data; using System.Drawing; using System.Threading; using System.Reflection; using System.Collections; using System.Net.Sockets; using System.Windows.Forms; using System.ComponentModel; using System.Drawing.Imaging; using System.Security.Cryptography; using System.Runtime.InteropServices; using System.Text.RegularExpressions; #endregion #region Assembly Info [assembly: AssemblyTitle("Test Application by eglic")] [assembly: AssemblyDescription("Test Application by eglic")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("eGlic.Com")] [assembly: AssemblyProduct("Test Application by eglic")] [assembly: AssemblyCopyright("Copyright (C) eGlic.Com 2007")] [assembly: AssemblyTrademark("eGlic.Com")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] #endregion namespace eGlic { #region Application Entrance public class Test{ [STAThread] public static void Main() { byte [] buffer=new byte [20]; DataGraphHeader header=new DataGraphHeader(); string data="ABCDEFGH"; header.Signature=0xFF; header.Protocol.Type=1; header.Protocol.Version=1; header.Type=99; header.SerialID=1234567; header.Size=8; Win32API.CopyMemoryEx(buffer,ref header); Win32API.CopyMemoryEx(buffer,12,System.Text.Encoding.ASCII.GetBytes(data),0,8); string o=""; for(int i=0;i<buffer.Length;i++){ if(buffer[i]<10) o+="0"; o+=String.Format("{0:X}",buffer[i]); o+=" "; } MessageBox.Show(o,"转成Byte []之后的数据包",MessageBoxButtons.OK,MessageBoxIcon.Information); DataGraphHeader h=new DataGraphHeader(); byte [] buf; string d=""; Win32API.CopyMemoryEx(ref h,buffer); buf=new byte [h.Size]; Win32API.CopyMemoryEx(buf,buffer,12,h.Size); o="h.Signature=" +h.Signature.ToString()+"/r/n"; o+="h.Protocol.Type=" +h.Protocol.Type.ToString()+"/r/n"; o+="h.Protocol.Version=" +h.Protocol.Version.ToString()+"/r/n"; o+="h.Type=" +h.Type.ToString()+"/r/n"; o+="h.SerialID=" +h.SerialID.ToString()+"/r/n"; o+="h.Size=" +h.Size.ToString()+"/r/n"; o+="附加数据为:"+System.Text.Encoding.ASCII.GetString(buf); MessageBox.Show(o,"解析后数据包",MessageBoxButtons.OK,MessageBoxIcon.Information); } } #endregion #region Win32API public class Win32API { [DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory", CharSet = CharSet.Ansi)] public extern static long CopyMemory(IntPtr dest, IntPtr source, int size); #region CopyMemoryEx /// <summary> /// CopyMemoryEx /// </summary> /// <param name="dest">目标缓存区</param> /// <param name="source">DataGraphPackage</param> /// <returns></returns> public unsafe static long CopyMemoryEx(byte[] dest, ref DataGraphHeader source) { return CopyMemoryEx(dest, 0,ref source); } /// <summary> /// CopyMemoryEx /// </summary> /// <param name="dest">目标缓存区</param> /// <param name="DestStart">目标缓存区中的开始位置</param> /// <param name="source">DataGraphPackage</param> /// <returns></returns> public unsafe static long CopyMemoryEx(byte[] dest,int DestStart, ref DataGraphHeader source) { IntPtr dp; IntPtr sp; fixed (byte* ds = &dest[DestStart]) { fixed (DataGraphHeader* sr = &source) { dp = (IntPtr)ds; sp = (IntPtr)sr; return CopyMemory(dp, sp, sizeof(DataGraphHeader)); } } } /// <summary> /// CopyMemoryEx /// </summary> /// <param name="dest">DataGraphPackage</param> /// <param name="source">源数据缓存</param> /// <returns></returns> public unsafe static long CopyMemoryEx(ref DataGraphHeader dest, byte[] source) { return CopyMemoryEx(ref dest, source, 0); } /// <summary> /// CopyMemoryEx /// </summary> /// <param name="dest">DataGraphPackage</param> /// <param name="source">源数据缓存</param> /// <returns></returns> public unsafe static long CopyMemoryEx(ref DataGraphHeader dest, byte[] source,int SourceStart) { IntPtr dp; IntPtr sp; fixed (DataGraphHeader* ds = &dest) { fixed (byte* sr = &source[SourceStart]) { dp = (IntPtr)ds; sp = (IntPtr)sr; return CopyMemory(dp, sp, sizeof(DataGraphHeader)); } } } /// <summary> /// CopyMemoryEx /// </summary> /// <param name="dest">目标缓存</param> /// <param name="source">源数据</param> /// <param name="size">要从源数据中复制的长度</param> /// <returns></returns> public unsafe static long CopyMemoryEx(byte[] dest, byte[] source, int size) { return CopyMemoryEx(dest, 0, source, 0, size); } /// <summary> /// CopyMemoryEx /// </summary> /// <param name="dest">目标缓存</param> /// <param name="source">源数据</param> /// <param name="SourceStart">源数据缓存中开始位置</param> /// <param name="size">要从源数据中复制的长度</param> /// <returns></returns> public unsafe static long CopyMemoryEx(byte[] dest, byte[] source, int SourceStart,int size) { return CopyMemoryEx(dest, 0, source, SourceStart, size); } /// <summary> /// CopyMemoryEx /// </summary> /// <param name="dest">目标缓存</param> /// <param name="DestStart">目标缓存中开始复制的位置</param> /// <param name="source">源数据</param> /// <param name="SourceStart">源数据缓存中开始位置</param> /// <param name="size">要从源数据中复制的长度</param> /// <returns></returns> public unsafe static long CopyMemoryEx(byte[] dest,int DestStart, byte[] source, int SourceStart, int size) { IntPtr dp; IntPtr sp; fixed (byte* ds = &dest[DestStart]) { fixed (byte* sr = &source[SourceStart]) { dp = (IntPtr)ds; sp = (IntPtr)sr; return CopyMemory(dp, sp, size); } } } #endregion } #endregion [StructLayout(LayoutKind.Sequential)] public struct ProtocolInfo { public byte Type; public byte Version; } [StructLayout(LayoutKind.Sequential)] public struct DataGraphHeader { public byte Signature; //包头: 1字节 public ProtocolInfo Protocol; //协议: 2字节 public byte Type; //包类型: 1字节 public uint SerialID; //包序号 4字节 public int Size; //包尺寸 4字节 } }

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Python/archive/2007/08/24/1757002.aspx

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++ 学习笔记

    指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。 声明格式为:*类型标识符 函数名(参数表)

    肉松
  • C#学习笔记(四)

    2. 对象之间的包含关系:一个类包含另外一个类。这类似于继承关系,但包含类可以控制对被包含类的成员的访问,甚至在使用被包含类的成员进行其他处理。

  • C#学习笔记(五)

    简单的按照成员副职对象可以通过派生于System.Object的MemberwiseClone()方法来完成。这是一个受保护的方法,但很容易在对象上定义一个调用...

  • C#学习笔记(一)

    1. 使用#region和#endregion关键字,来定义可以展开和折叠的代码区域的开头和结尾

  • C#学习笔记(二)

  • C#学习笔记(三)

    隐式转换:从类型A到类型B的转换可以在所有情况下进行,执行转换的规则非常简单,可以让编译器执行转换。

  • c++ 学习笔记(二)

    type 是指针的基类型,它必须是一个有效的 C++ 数据类型,var-name 是指针变量的名称

    码缘
  • c++ 学习笔记(一)

    将int类型冲洗定义一个名称 hello,只是起了一个新的名字原来的还是可以继续使用的

    码缘
  • C++ vector学习笔记

    LRainner
  • c++ sort 学习笔记

    sort(begin,end,排序方法),排序方法可以从大到小,也可以从小到大,若不传第三个参数,默认从小到大排序

    LRainner
  • C# IoC学习笔记

    IoC-Invertion of Control,即控制反转,是一种程序设计思想。

    用户9127601
  • c++ stack / queue 学习笔记

    LRainner
  • C++ string类学习笔记

    s.find_first_of():查找是否含有字串中任何一个字符,并返回第一次出现位置

    LRainner
  • C语言学习笔记

    const :加在int前面,用于给一个变量加上一个const(不变的)的属性。这个const的属性表示这个变量的值一旦初始化,就不能再修改了。

    用户1788308
  • C语言学习笔记

    double 1.printf(”%f,…”) 2.scanf(“%lf,…”)

    blankmiss
  • C#语法学习笔记

    Protected 访问修饰符允许子类访问它的基类的成员变量和成员函数。这样有助于实现继承。我们将在继承的章节详细讨论这个。更详细地讨论这个。

    算法发
  • c++ cin, get学习笔记

    接收一个可以包含空格的string类字符串,需要包含头文件#include <string>

    LRainner
  • C++primer学习笔记(五)

    震八方紫面昆仑侠
  • C++primer学习笔记(四)

    震八方紫面昆仑侠

扫码关注云+社区

领取腾讯云代金券