前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#学习笔记——CopyMemory

C#学习笔记——CopyMemory

作者头像
vv彭
发布2021-08-06 09:58:45
8920
发布2021-08-06 09:58:45
举报
文章被收录于专栏:c#学习笔记c#学习笔记

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-07-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档