C#里使用CopyMemory

使用Ant和org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader打包可运行Jar后找不到main的解决方案 因为有了Eclipse自带的Jar-in-Jar工具,使得我们可以把第三方的jar直接打包到我们自己的jar中,而不需要一个个解压再打入,非常方便,我们需要做的只是将jar-in-jar.zip打入我们的jar,然后将MANIFEST.MF写成相应的格式即可,一般来说我们的ant打包脚本应该如下所示: 阅读详情

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

C#代码
  1. #region Imports   
  2. using System;   
  3. using System.IO;   
  4. using System.Net;   
  5. using System.Xml;   
  6. using System.Text;   
  7. using System.Data;   
  8. using System.Drawing;   
  9. using System.Threading;   
  10. using System.Reflection;   
  11. using System.Collections;   
  12. using System.Net.Sockets;   
  13. using System.Windows.Forms;   
  14. using System.ComponentModel;   
  15. using System.Drawing.Imaging;   
  16. using System.Security.Cryptography;   
  17. using System.Runtime.InteropServices;   
  18. using System.Text.RegularExpressions;  
  19. #endregion  
  20. #region Assembly Info   
  21. [assembly: AssemblyTitle("Test Application by eglic")]   
  22. [assembly: AssemblyDescription("Test Application by eglic")]   
  23. [assembly: AssemblyConfiguration("")]   
  24. [assembly: AssemblyCompany("eGlic.Com")]   
  25. [assembly: AssemblyProduct("Test Application by eglic")]   
  26. [assembly: AssemblyCopyright("Copyright (C) eGlic.Com 2007")]   
  27. [assembly: AssemblyTrademark("eGlic.Com")]   
  28. [assembly: AssemblyCulture("")]   
  29. [assembly: ComVisible(false)]   
  30. [assembly: AssemblyVersion("1.0.0.0")]   
  31. [assembly: AssemblyFileVersion("1.0.0.0")]  
  32. #endregion   
  33.   
  34. namespace eGlic   
  35. {  
  36.     #region Application Entrance   
  37.     public class Test{   
  38.         [STAThread]   
  39.         public static void Main() {   
  40.             byte [] buffer=new byte [20];   
  41.             DataGraphHeader header=new DataGraphHeader();   
  42.             string data="ABCDEFGH";   
  43.                
  44.             header.Signature=0xFF;   
  45.             header.Protocol.Type=1;   
  46.             header.Protocol.Version=1;   
  47.             header.Type=99;   
  48.             header.SerialID=1234567;   
  49.             header.Size=8;   
  50.                
  51.             Win32API.CopyMemoryEx(buffer,ref header);   
  52.             Win32API.CopyMemoryEx(buffer,12,System.Text.Encoding.ASCII.GetBytes(data),0,8);   
  53.                
  54.             string o="";   
  55.             for(int i=0;i<buffer.Length;i++){   
  56.                 if(buffer[i]<10) o+="0";   
  57.                 o+=String.Format("{0:X}",buffer[i]);   
  58.                 o+=" ";   
  59.             }   
  60.             MessageBox.Show(o,"转成Byte []之后的数据包",MessageBoxButtons.OK,MessageBoxIcon.Information);   
  61.                
  62.             DataGraphHeader h=new DataGraphHeader();   
  63.             byte [] buf;   
  64.             string d="";   
  65.                
  66.             Win32API.CopyMemoryEx(ref h,buffer);   
  67.             buf=new byte [h.Size];   
  68.             Win32API.CopyMemoryEx(buf,buffer,12,h.Size);   
  69.                
  70.             o="h.Signature=" +h.Signature.ToString()+"/r/n";   
  71.             o+="h.Protocol.Type=" +h.Protocol.Type.ToString()+"/r/n";   
  72.             o+="h.Protocol.Version=" +h.Protocol.Version.ToString()+"/r/n";   
  73.             o+="h.Type=" +h.Type.ToString()+"/r/n";   
  74.             o+="h.SerialID=" +h.SerialID.ToString()+"/r/n";   
  75.             o+="h.Size=" +h.Size.ToString()+"/r/n";   
  76.             o+="附加数据为:"+System.Text.Encoding.ASCII.GetString(buf);   
  77.             MessageBox.Show(o,"解析后数据包",MessageBoxButtons.OK,MessageBoxIcon.Information);   
  78.         }   
  79.            
  80.     }  
  81.     #endregion  
  82.       
  83.     #region Win32API   
  84.     public class Win32API {   
  85.         [DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory", CharSet = CharSet.Ansi)]   
  86.         public extern static long CopyMemory(IntPtr dest, IntPtr source, int size);  
  87.         #region CopyMemoryEx   
  88.         /// <summary>   
  89.         /// CopyMemoryEx   
  90.         /// </summary>   
  91.         /// <param name="dest">目标缓存区</param>   
  92.         /// <param name="source">DataGraphPackage</param>   
  93.         /// <returns></returns>   
  94.         public unsafe static long CopyMemoryEx(byte[] dest, ref DataGraphHeader source) {   
  95.             return CopyMemoryEx(dest, 0,ref source);   
  96.         }   
  97.         /// <summary>   
  98.         /// CopyMemoryEx   
  99.         /// </summary>   
  100.         /// <param name="dest">目标缓存区</param>   
  101.         /// <param name="DestStart">目标缓存区中的开始位置</param>   
  102.         /// <param name="source">DataGraphPackage</param>   
  103.         /// <returns></returns>   
  104.         public unsafe static long CopyMemoryEx(byte[] dest,int DestStart, ref DataGraphHeader source) {   
  105.             IntPtr dp;   
  106.             IntPtr sp;   
  107.             fixed (byte* ds = &dest[DestStart]) {   
  108.                 fixed (DataGraphHeader* sr = &source) {   
  109.                     dp = (IntPtr)ds;   
  110.                     sp = (IntPtr)sr;   
  111.                     return CopyMemory(dp, sp, sizeof(DataGraphHeader));   
  112.                 }   
  113.             }   
  114.         }   
  115.         /// <summary>   
  116.         /// CopyMemoryEx   
  117.         /// </summary>   
  118.         /// <param name="dest">DataGraphPackage</param>   
  119.         /// <param name="source">源数据缓存</param>   
  120.         /// <returns></returns>   
  121.         public unsafe static long CopyMemoryEx(ref DataGraphHeader dest, byte[] source) {   
  122.             return CopyMemoryEx(ref dest, source, 0);   
  123.         }   
  124.         /// <summary>   
  125.         /// CopyMemoryEx   
  126.         /// </summary>   
  127.         /// <param name="dest">DataGraphPackage</param>   
  128.         /// <param name="source">源数据缓存</param>   
  129.         /// <returns></returns>   
  130.         public unsafe static long CopyMemoryEx(ref DataGraphHeader dest, byte[] source,int SourceStart) {   
  131.             IntPtr dp;   
  132.             IntPtr sp;   
  133.             fixed (DataGraphHeader* ds = &dest) {   
  134.                 fixed (byte* sr = &source[SourceStart]) {   
  135.                     dp = (IntPtr)ds;   
  136.                     sp = (IntPtr)sr;   
  137.                     return CopyMemory(dp, sp, sizeof(DataGraphHeader));   
  138.                 }   
  139.             }   
  140.         }   
  141.         /// <summary>   
  142.         /// CopyMemoryEx   
  143.         /// </summary>   
  144.         /// <param name="dest">目标缓存</param>   
  145.         /// <param name="source">源数据</param>   
  146.         /// <param name="size">要从源数据中复制的长度</param>   
  147.         /// <returns></returns>   
  148.         public unsafe static long CopyMemoryEx(byte[] dest, byte[] source, int size) {   
  149.             return CopyMemoryEx(dest, 0, source, 0, size);   
  150.         }   
  151.         /// <summary>   
  152.         /// CopyMemoryEx   
  153.         /// </summary>   
  154.         /// <param name="dest">目标缓存</param>   
  155.         /// <param name="source">源数据</param>   
  156.         /// <param name="SourceStart">源数据缓存中开始位置</param>   
  157.         /// <param name="size">要从源数据中复制的长度</param>   
  158.         /// <returns></returns>   
  159.         public unsafe static long CopyMemoryEx(byte[] dest, byte[] source, int SourceStart,int size) {   
  160.             return CopyMemoryEx(dest, 0, source, SourceStart, size);   
  161.         }   
  162.         /// <summary>   
  163.         /// CopyMemoryEx   
  164.         /// </summary>   
  165.         /// <param name="dest">目标缓存</param>   
  166.         /// <param name="DestStart">目标缓存中开始复制的位置</param>   
  167.         /// <param name="source">源数据</param>   
  168.         /// <param name="SourceStart">源数据缓存中开始位置</param>   
  169.         /// <param name="size">要从源数据中复制的长度</param>   
  170.         /// <returns></returns>   
  171.         public unsafe static long CopyMemoryEx(byte[] dest,int DestStart, byte[] source, int SourceStart, int size) {   
  172.             IntPtr dp;   
  173.             IntPtr sp;   
  174.             fixed (byte* ds = &dest[DestStart]) {   
  175.                 fixed (byte* sr = &source[SourceStart]) {   
  176.                     dp = (IntPtr)ds;   
  177.                     sp = (IntPtr)sr;   
  178.                     return CopyMemory(dp, sp, size);   
  179.                 }   
  180.             }   
  181.         }  
  182.         #endregion   
  183.     }  
  184.     #endregion   
  185.        
  186.     [StructLayout(LayoutKind.Sequential)]   
  187.     public struct ProtocolInfo {   
  188.         public byte Type;   
  189.         public byte Version;   
  190.     }   
  191.        
  192.     [StructLayout(LayoutKind.Sequential)]   
  193.     public struct DataGraphHeader {   
  194.         public byte Signature;              //包头:    1字节   
  195.         public ProtocolInfo Protocol;       //协议:    2字节   
  196.         public byte Type;                   //包类型:  1字节   
  197.         public uint SerialID;               //包序号    4字节   
  198.         public int Size;                    //包尺寸    4字节   
  199.     }   
  200. }  
 
利用CopyMemory实现IEEE754与十进制float之间的转换 对于vb vb.net c#或者 c来说,单精度浮点数在内存中占用4个字节,本身就是以IEEE754的标准格式来存储的。所以当我们需要用到的时候,其实并不需要自己去转换,直接以内存指针的方式,将内存中的数据以我们需要的方式读出来即可。这里利用了API函数CopyMemory和varPtr函数,在VB中对IEEE754和single之间进行转换。也可以用于vb.net等其他语言。对于做modbus通讯的朋友会有帮助。 立即下载

相关推荐

jmeter小白下载安装步骤

本文仅仅简单介绍了jmeter工具的下载安装,以及基础的操作步骤。

昔年@曦的博客 3492

关于C#中的指针拷贝

1、RtlCopyMemory与RtlMoveMemory 这两个函数是内核函数api,对应Win32 API是CopyMemory和MoveMemory。都能实现内存块的复制,两者的区别在于CopyMemory是非重叠内存区域的复制,MoveMemory可以不考虑是否重叠,都可以安全复制。 2、Marshal类 Marshal.copy()方法用来在托管对象(数组)和非托管对象(IntPtr)之间进行内容的复制。但是它只能实现数组拷贝

qq_37189288的博客 2994

鸿蒙OpenHarmony南向开发 轻量系统芯片移植指南(一)

OpenHarmony系统采用"系统>子系统>部件"层级架构,支持功能模块化裁剪。本文介绍了关键子系统及移植方法:1)启动恢复子系统负责内核到应用间的进程初始化,需配置启动入口标识及链接脚本;2)文件子系统提供基础文件操作接口,需适配HAL层文件读写功能,可通过Flash模拟、轻量文件系统或厂商自有方案实现。移植过程需修改config.json配置,添加对应组件定义及功能实现。系统采用模块化设计,开发者可根据实际需求灵活配置所需子系统功能。

yx525623的博客 1131

C# CopyMemory 整数、浮点数内存互换(不是简单的类型转换)

核心类:BitConverter 例子: double a = BitConverter.Int64BitsToDouble (2342354); Debug.Log (a);//1.15727664179883E-317 BitConverter类还有以下几个函数: BitConverter.ToBoolean (); BitConverter.ToChar ();

wsko0715的专栏 2428

通俗讲解清楚光线追踪中的蒙特卡洛积分

彻底讲解光线追踪中的蒙特卡洛积分

qq_37366618的博客 1243

半导体行业周期分析:库存、需求与复苏路径深度解读

半导体行业作为现代科技产业的基石,其周期性波动受供需关系、库存水平和宏观经济等多重因素影响。从技术原理上看,行业景气度通常通过库存周转天数、晶圆厂产能利用率等核心指标进行监测,这些指标反映了产业链各环节的健康状况。在工程实践中,理解这些指标有助于企业进行库存管理和产能规划,从而提升运营效率。当前,半导体市场正经历结构性分化,其中**库存周转天数**和**晶圆厂产能利用率**成为判断市场拐点的关键。在应用场景上,汽车电子、人工智能等领域需求相对稳健,而消费电子则面临较大压力。本文聚焦于半导体行业的周期特征,探

weixin_29549793的博客 682

C# 函数memcpy和memmove的使用和模拟实现(详解)

memcpy函数和memmove函数的教学,以及它们的模拟实现

muzi_liii的博客 2165

【Unity 实用工具篇】✨| 受击插件Feel 详细教程,开发游戏时更好的操控 游戏打击感

在一个游戏中,游戏手感对于游戏的整体游玩体验是非常重要的,而游戏手感中有一个很重要的点:打击感 那本篇文章就来讲一下打击感中的受击反馈部分。 在游戏中经常会用到攻击敌人,敌人扣血,执行某些受击功能的执行,尤其是对于有战斗场景的游戏来说,这就是标准的受击反馈。 所以引出本篇文章的主角:受击插件 Feel 的使用,2D和3D游戏都可以使用。

努力前行,总会成为自己心中的那道光 3万+

用java命令运行一个工程的main函数,ant打jar包,并且jar包可以直接运行

1. java -cp 相关 java -cp "[color=red]classes[/color]:lib/log4j-1.2.15.jar:lib/commons-configuration-1.8.jar:lib/commons-lang-2.4.jar:lib/commons-logging-1.1.1.jar:lib/netty-3.5.2.Final.jar:lib/commo...

gushuizerotoone的博客 341

Linux故障排查和性能优化面试题及参考答案

在 Linux 系统中,负载(Load Average)是衡量系统繁忙程度的一个重要指标,它表示系统在特定时间间隔内运行队列中的平均进程数。负载值反映了系统当前的工作压力,主要包括 CPU 等待运行的进程数量和处于不可中断睡眠状态(通常是等待 I/O 操作完成)的进程数量。负载平均值通常有三个数值,分别代表过去 1 分钟、5 分钟和 15 分钟内的系统平均负载。例如,在使用uptime命令或查看文件时,会看到类似这样的输出,这三个数值依次表示过去 1 分钟、5 分钟和 15 分钟的负载平均值。

大模型大数据攻城狮的专栏 1081

【YOLOv8系列】YOLOv8的webUI界面设计;通过Streamlit实现YOLOv8的可视化交互界面设计

但是我为了避免重复性的工作,且为了避免重复安装之前(安装pytorch和yolov8时)已经安装好的库,因此写了一个python脚本进行安装;需要提前在有网络连接的电脑上下载所有必要的依赖项,然后将这些文件传输到离线的机器上进行安装。脚本将自动跳过已安装的包,并安装其余的 .whl 文件。在离线的机器上,切换到包含下载好的文件的目录。证明我们的streamlit安装成功了。证明你的streamlit安装成功了。第一步:在有网络连接的电脑上下载。第二步:将下载的文件传输到离线机器。文件)传输到离线的机器上。

AnChenliang_1002的博客 1566

ant jar包使用步驟

1、新建一個project 2、新建一個類,輸出helloworld  3、新建build.xml文件,如下:                                                                                                                        

soar的博客 7744

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

JAVA项目通过IDEA如何构建可执行JAR

开发JAVA工程代码(main方法启动)如何构建出可以通过java -jar命令直接执行的jar?如果工程中依赖其他jar又如何处理?本文即针对以上两点通过IDEA开发工具来做一个简单的分析和尝试,测试四种方法构建可执行jar。

bk120的博客 5305

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Jar Jar Links与Ant集成完全教程:构建无依赖的单一JAR文件

Jar Jar Links是一款强大的Java库重打包工具,能够帮助开发者轻松将第三方依赖嵌入到自己的项目中,构建出无外部依赖的单一JAR文件。本教程将详细介绍如何将Jar Jar Links与Ant构建工具集成,通过简单配置实现Java项目的依赖打包与重命名,让你的应用部署更便捷。 ## 📋 准备工作:环境与工具要求 在开始集成前,请确保你的开发环境满足以下条件: - JDK 8或更高版本

gitblog_01096的博客 950

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

ant打包jar文件

笔者以前在项目中使用的最多的打包工具要数fatjar了。打包的时候习惯于先指定可执行类,然后将所有引用的jar包以及源码生成的class一起打到 一个包里面,运行程序的时候直接运行命令:java –jar jarname.jar。看似很方便。但是,这样做有两个缺点:1.将所有jar包都整合到一起,导致jar包太大,一般最小几百k,最大十几MB都有, ...

ddvyg02484的专栏 229

ant使用(一)生成jar包

作用:非web的普通java工程可以打成jar包供其他工程调用或者有mian方法直接执行. 1. 编写测试代码 package com.liufq; public class Test { public static void main(String[] args) { System.out.println("***********test an

叶沐雨的专栏 4171

Ant打可执行jar包指南

转至 http://blog.youkuaiyun.com/telnetor/article/details/7015935 笔者以前在项目中使用的最多的打包工具要数fatjar了。打包的时候习惯于先指定可执行类,然后将所有引用的jar包以及源码生成的class一起打到一个包里面,运行程序的时候直接运行命令:Java –jar jarname.jar。看似很方便。但是,这样做有两个缺

JokeMan的博客 553

Ant打包jar,程序的混淆

Ant打包jar,程序的混淆 cmd命令下: Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp. C:\Documents and Settings\new>d: D:\

Working harder, getting stronger! 3262

Apache Ant运行时Unable to locate tools.jar解决方法

Apache Ant运行时Unable to locate tools.jar解决方法 分类: 敏捷/持续集成CI 白盒/单元测试 2013-04-22 20:32 4624人阅读 评论(2) 收藏 举报 AntApachetools.jar 下载Apache Ant 一、解压ant安装包在D:\ant下 二、环境变量配置 ANT_HOME D:\ant

1201

c 调用java jar_javac、java打jar包命令实例

Java开发中使用IDE工具肯定会很大程度的提高开发效率,但是有时候需要用java命令在服务器上启动Java工程代码来完成一系列的功能 ,当然用ANT也非常方便。下面以简单HelloWorld代码为例子来记录,如何使用最基本的Java命令。一、编写HelloWorld,代码如下:public class Hello{public static void main(String[] args) {S...

weixin_42548888的博客 256

bat调用ant_ant打jar包以及制作成bat文件双击运行

package com.joe.test;import java.util.logging.Logger;/*** @author:joe* @createtime: 2011-7-29 下午08:07:48* @version:1.0* @filename:Test.java* @description:ant打jar包以及制作成bat文件双击运行测试类*/public class Test {...

weixin_42573647的博客 178

Apache Ant 从入门到精通:Java项目构建的完整指南

我们平常在写 Java 程序的时候,基本的步骤都是 打开一个集成开发环境(Eclipse 或者 Intellij IDEA)-> 开开心心的敲代码 ->点击 Run,就可以很有成就的看到自己辛劳的成果了。但是在实际的项目开发中,我们的项目会很大,而且在部署到服务器的时候我们需要用到一些自动化的工具(比如 jenkins),这个时候我们熟悉的集成开发环境就不存在了,因此我们需要用另外一种编译、打包、运行程序的方法。

ywl470812087的博客 13万+

如何不通过maven或者ant将项目打包成可执行的Jar包

1,使用jar命令 比如我有以下需要打包的.class文件 package/com/redis/ClassA.class package/com/redis/ClassB.class package/com/redis/ClassC.class package/com/redis/MainClass.class  (如果该Jar包时提供给别的程序使用的则不需要Main函数) 可

Ancinent的专栏 1492
上一篇: 深入探讨如何在 C# 中使用 Win32 和其他现有库
下一篇: C#如何打印条形码EAN13码
Python
博客等级 码龄26年 1973粉丝 1567原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值