static void Main(string[] args)
{
byte[] a = new byte[]{,,,};
byte[] b = new byte[] {,,,};
IntPtr pt = Marshal.AllocHGlobal(a.Length);
//从source数组的startIndex下标开始复制length个对象到ptr;
Marshal.Copy(b,,pt+,b.Length);
//从ptr复制length个对象到目标数组的,从目标数组的startIndex开始写入。
Marshal.Copy((pt+),a,,);
unsafe
{
byte* pb = (byte*) pt;
for (int i = ; i < a.Length; i++)
{
Console.WriteLine("/b:"+(*pb++) + "/a:" + a[i]);
}
}
//释放非托管内存;
Marshal.FreeHGlobal(pt); byte[] arBt = new byte[]{,,,,,,,,,,,,,,0x0f,};
IntPtr ptr = Marshal.AllocHGlobal(arBt.Length);
//写入数据;
Marshal.Copy(arBt, , ptr, arBt.Length);
short[] arSt = new short[arBt.Length / sizeof(short)];
int[] arInt = new int[arBt.Length / sizeof(int)];
//复制为short数据;
Marshal.Copy(ptr, arSt, , arSt.Length);
//调整数据 此时arSt不变 下面的arInt改变;
Marshal.WriteByte(ptr, , );
Marshal.WriteByte(ptr, , (byte)(Marshal.ReadByte(ptr,)*));
//复制为int数据;
Marshal.Copy(ptr, arInt, , arInt.Length);
for (int i = ; i < arBt.Length; i++)
{
Console.Write(arBt[i] + "-");
}
Console.WriteLine();
for (int i = ; i < arBt.Length; i++)
{
Console.Write(Marshal.ReadByte(ptr,i) + "-");
}
Console.WriteLine();
unsafe
{  //获取指定数组中指定索引处的元素的地址
short* ps = (short*)Marshal.UnsafeAddrOfPinnedArrayElement(arSt, );
byte[] tmp0 = BitConverter.GetBytes(*ps);
Console.WriteLine(*ps+ "/" + (ushort)*ps+ ",byte>>>&0=" + tmp0[] + ",&1=" + tmp0[]);
          //获取指定数组中指定索引处的元素的地址
int* pi = (int*)Marshal.UnsafeAddrOfPinnedArrayElement(arInt, );
byte[] tmp1 = BitConverter.GetBytes(*pi);
Console.WriteLine(*pi + "/" + (uint)*pi + ",byte>>>&0=" + tmp1[] + ",&1=" + tmp1[] +",&2="+ tmp1[] + ",&3=" + tmp1[]); Console.WriteLine("-----short 2 byte-----");
for (int i = ; i < arSt.Length; i++)
{
byte[] tmp = BitConverter.GetBytes(arSt[i]);
Console.WriteLine(arSt[i] + "/" + (ushort)arSt[i] + ",byte>>>&0=" + tmp[] + ",&1=" + tmp[]);
}
Console.WriteLine("-----int 2 byte-----");
for (int i = ; i < arInt.Length; i++)
{
byte[] tmp = BitConverter.GetBytes(arInt[i]);
Console.WriteLine(arInt[i] + "/" + (uint)arInt[i] + ",byte>>>&0=" + tmp[] + ",&1=" + tmp[] + ",&2=" + tmp[] + ",&3=" + tmp[]);
}
}
Marshal.FreeHGlobal(ptr);
       unsafe
{
Test tt = new Test();
tt.t1 = ;
tt.t2 = true;
tt.t3 = ;
tt.t4 = ;
tt.t6 = false;
string s = "ABCD大师0X00";
char[] chs = s.ToCharArray();
char* block = stackalloc char[];
fixed (char* cpt = chs)
{
for (int i = ; i < chs.Length; i++)
{
tt.t5[i] = *(cpt + i);
block[i] = *(cpt + i);
}
Console.WriteLine(new string(tt.t5));
}
}
}
        [StructLayout(LayoutKind.Sequential, Pack = )]
public unsafe struct Test
{
public byte t1;
public bool t2;
public ushort t3;
public int t4;
//固定大小的缓冲区
public fixed char t5[];
public bool t6;
}

//----------------------------------

通过上面的例子,我们可以看出,使用C#指针操作内存,非常方便。使用Marshal我们可以获得非托管内存的指针IntPtr。该指针我们可以强制转换为

sbytebyteshortushortintuintlongulongcharfloatdoubledecimalbool的类型指针。之后我们可以Copy,Read ,Write等操作内存。

同C++一样我们获得的指针可以通过指针运算符 *,->,&,++,--进行指定内存的数据和位移操作。也可以通过Marshal,将我们的byte类型数据进行类型转换操作。

Marshal类提供的转换函数功能之强大。

可参阅https://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.marshal_methods%28v=vs.80%29.aspx;

C#指针操作Marshal实例的更多相关文章

  1. C语言指针操作

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/pointer-manipulation. ...

  2. Python操作Mysql实例代码教程在线版(查询手册)_python

    实例1.取得MYSQL的版本 在windows环境下安装mysql模块用于python开发 MySQL-python Windows下EXE安装文件下载 复制代码 代码如下: # -*- coding ...

  3. C# 指针操作相关

    C# 指针操作相关 =========================================            // ** 取int 地址 以指针访问指向值 ** //         ...

  4. 基本的window.document操作及实例

    基本的window.document操作及实例 找元素 1.根据id找 var d1 = document.getElementById("d1"); alert(d1); 2.根 ...

  5. Selenium2学习-040-JavaScript弹出框(alert、confirm、prompt)操作演示实例

    弹出框是网页自动化测试常见得操作页面元素之一,常见的JavaScript弹出框有如下三种: 1.alert(message):方法用于显示带有一条指定消息和一个 OK 按钮的警告框.DemoAlert ...

  6. C#开发中使用Npoi操作excel实例代码

    C#开发中使用Npoi操作excel实例代码 出处:西西整理 作者:西西 日期:2012/11/16 9:35:50 [大 中 小] 评论: 0 | 我要发表看法 Npoi 是什么? 1.整个Exce ...

  7. Selenium2学习-014-WebUI自动化实战实例-012-Selenium 操作下拉列表实例-div+{js|jquery}

    之前已经讲过了 Selenium 操作 Select 实现的下拉列表:Selenium2学习-010-WebUI自动化实战实例-008-Selenium 操作下拉列表实例-Select,但是在实际的日 ...

  8. Selenium2学习-010-WebUI自动化实战实例-008-Selenium 操作下拉列表实例-Select

    此文主要讲述用 Java 编写 Selenium 自动化测试脚本编写过程中,对下拉列表框 Select 的操作. 下拉列表是 Web UI 自动化测试过程中使用率非常高的,通常有两种形式的下拉列表,一 ...

  9. Day4:T1小技巧(类似于指针操作)T2搜索+小细节

    Day4:其中有很多小技巧get T1 一直没有听到过像这样的小技巧的略专业名词,有点类似于指针操作,之前有碰到过很多这样的题目 每次都是以不同的形式出现,但是感觉思想还是有点接近的吧(就比如某天有一 ...

随机推荐

  1. java作业——整数相加

    设计思路:由于命令行参数都是字符串,所以解决问题的关键在于字符串和整数之间的转化.首先定义数组,让所要相加的数组成一个数组,然后实现数组的字符串转化为整数,最后相加输出就行了. 程序流程图: 源代码: ...

  2. C语言知识整理(1):简介

    由于项目要求,需要学习iOS移动端开发.iOS开发的核心语言是Objective-C,Objective-C是在C语言的基础加了一层面向对象的语法.为了能够更好地掌握Objective-C,故先学习C ...

  3. outlook 用宏发邮件

    经常发面试邮件,通常只是修改一下收件人邮箱地址,和收件人姓名,其他全部一致,有木有发现每次都用用outlook写邮件很麻烦? 使用宏发邮件,就会不麻烦了,直接修改下称呼,修改下收件人地址,按下F5,就 ...

  4. 所思所想 js模板引擎

    将服务端生成的HTML标记的事情交给了客户端来做 那么服务端的职责是什么呢? 职责就是处理最终的返回结果,纯数据  handler

  5. 实战SQL Server 2005镜像配置全过程

    SQL Server 2005镜像配置基本概念 我理解的SQL Server 2005镜像配置实际上就是由三个服务器(也可以是同一服务器的三个 SQL 实例)组成的一个保证数据的环境,分别是:主服务器 ...

  6. C#伪静态实现的方法

    在asp.net开发网站的时候,我们经常会用到伪静态,好处是可以隐藏真实的路径,提高网站的安全性,在官网等展示网站希望对搜索引擎友好,提高搜索排名:或者在涉及到模板开发都会用到伪静态.下面讲解下平时用 ...

  7. Qt 制作安装包

    Qt 制作在线.离线 安装包 见如下文档

  8. 各种常用函数 (SQL)

    数学函数 1.绝对值 S:select abs(-1) value O:select abs(-1) value from dual   2.取整(大) S:select ceiling(-1.001 ...

  9. 长理ACM 13-围圈报数(谌海军)

    题目标题:围圈报数(谌海军) 题目描述:有n(n<=100)围成一圈,顺序排号(从1排到n).从第一个人开始报数(从1报到m(m<=9)),凡报到m的人退出圈子,问最后留下的是原来第几号的 ...

  10. 【C语言学习】-01 C基础

    本文目录: 0.进制转换 1.C数据类型 2.常量变量 3.运算符 4.表达式 5.格式化输入输出 回到顶部 0.进制转换 在计算机中存储的数据,主要是以二进制形式存在,而我们生活中主要使用的有十进制 ...