Marshal.copy()方法用来
在托管对象(数组)和非托管对象(IntPtr)之间进行内容的复制
函数有很多重载,如下所示:
Copy(array<Byte>[]()[], Int32, IntPtr, Int32) 将一维的托管 8 位无符号整数数组中的数据复制到非托管内存指针。
Copy(array<Char>[]()[], Int32, IntPtr, Int32) 将数据从一维的托管字符数组复制到非托管内存指针。
Copy(array<Double>[]()[], Int32, IntPtr, Int32) 将数据从一维的托管双精度浮点数组复制到非托管内存指针。
Copy(array<Int16>[]()[], Int32, IntPtr, Int32) 将数据从一维的托管 16 位带符号整数数组复制到非托管内存指针。
Copy(array<Int32>[]()[], Int32, IntPtr, Int32) 将数据从一维的托管 32 位带符号整数数组复制到非托管内存指针。
Copy(array<Int64>[]()[], Int32, IntPtr, Int32) 将数据从一维的托管 64 位带符号整数数组复制到非托管内存指针。
Copy(IntPtr, array<Byte>[]()[], Int32, Int32) 将数据从非托管内存指针复制到托管 8 位无符号整数数组。
Copy(IntPtr, array<Char>[]()[], Int32, Int32) 将数据从非托管内存指针复制到托管字符数组。
Copy(IntPtr, array<Double>[]()[], Int32, Int32) 将数据从非托管内存指针复制到托管双精度浮点数组。
Copy(IntPtr, array<Int16>[]()[], Int32, Int32) 将数据从非托管内存指针复制到托管 16 位带符号整数数组。
Copy(IntPtr, array<Int32>[]()[], Int32, Int32) 将数据从非托管内存指针复制到托管 32 位带符号整数数组。
Copy(IntPtr, array<Int64>[]()[], Int32, Int32) 将数据从非托管内存指针复制到托管 64 位带符号整数数组。
Copy(IntPtr, array<IntPtr>[]()[], Int32, Int32) 将数据从非托管内存指针复制到托管 IntPtr 数组。
Copy(IntPtr, array<Single>[]()[], Int32, Int32) 将数据从非托管内存指针复制到托管单精度浮点数组。
Copy(array<IntPtr>[]()[], Int32, IntPtr, Int32) 将数据从一维托管 IntPtr 数组复制到非托管内存指针。
Copy(array<Single>[]()[], Int32, IntPtr, Int32) 将数据从一维的托管单精度浮点数组复制到非托管内存指针。
这里需要注意的是两个参数Int32类型的使用
I
nt32类型的两个参数都是用来限定数组的,其中一个限定开始位置,一个限定长度
注意:长度是指数组元素的个数,而不是指字节数
-
string name =
"xuwei"
;
-
IntPtr pName = Marshal.AllocHGlobal(2*name.Length);
-
Marshal.Copy(name.ToCharArray(), 0, pName, name.Length);
-
char
[] cName =
new
char
[name.Length];
-
Marshal.Copy(pName, cName, 0, name.Length);
易知name.Length=5
(1) 给pName指针分配了
2*name.Length字节的空间
注意:
Marshal.AllocHGlobal(Int32 cb)
中的参数cb是
分配的字节数
(2) 将name转换的char[]中的内容复制到pName所指的内存中,
所取长度
为char的个数,即
name.Length
(3) 给cName分配name.Length个char位置
(4) 将pName中的内容复制到cName数组中,长度同样为name.Length
原文地址:http://blog.csdn.net/xiaobai1593/article/details/7065955
c#中Marshal.Copy()方法的使用c#中Marshal.Copy方法的使用Marshal.copy()方法用来在托管对象(数组)和非托管对象(IntPtr)之间进行内容的复制函数有很多重载,如下所示:Copy(array[]()[], Int32, IntPtr, Int32) 将一维的托管 8 位无符号整数数组中的数据复制到非托管内存指针。Copy(arra
验证码(Captcha)基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证,最大程度地保护注册登录、活动秒杀、点赞发帖、
数据
保护等各大场景下的业务安全。要做自动化脚本程序,就要能识别验证码这一关。
效果如下图:
演示程序结构
在vs2019创建WinForm窗体程序,添加相应的控件
一,
使用
OpenFileDialog类,可以选择图片文件
二,
使用
AspriseOCR.dll,识别图片,主要的函数strcode =
Mar
sha
l.PtrToStringAnsi(OCR(path, -1));
本文演示了,
C#
使用
AspriseOCR.dll,实
C#
Mar
sha
l.
Copy
实现
非
托管
指针和数组之间的转换
VectorFileIO套件里面 读写文件是 IntPtr类型的指针操作。 原始
数据
是Int32数组(Int[采样点,通道]),要写入文件。读出文件要转换成反映的物理变量是采集的double波形 (double[通道,采样点])。
//初始化缓存指针对应的
非
托管
内存
IntPtr IntPtr变量 =
Mar
sha
l.Al...
可见,
Mar
sha
l主要是用来操作
非
托管
内存的。此类
中
定义的大多数
方法
是提供给开发人员的
托管
和
非
托管
编程模型之间的桥梁。例如, StringToHGlobalAnsi
方法
将ANSI字符从指定的字符串(在
托管
堆
中
)
复制
到
非
托管
堆
中
的缓冲区。该
方法
还分配适当大小的目标堆。
System.Runtime。InteropServices
Mar
sha
l所在的命名空间主要...
在
C#
中
不能直接
使用
C 语言的数组写法,因为
C#
是一门面向对象的语言,并且有自己的数组类型。不过,你可以
使用
C#
提供的一些
方法
将 C 语言数组转换为
C#
数组。例如:
1.
使用
Mar
sha
l.
Copy
()
方法
将 C 语言数组
复制
到
C#
数组
中
。
```c
sha
rp
int[] c
sha
rpArray = new int[10];
int[] cArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
IntPtr cArrayPtr =
Mar
sha
l.AllocHGlobal(
Mar
sha
l.SizeOf(typeof(int)) * cArray.Length);
Mar
sha
l.
Copy
(cArray, 0, cArrayPtr, cArray.Length);
Mar
sha
l.
Copy
(cArrayPtr, c
sha
rpArray, 0, cArray.Length);
Mar
sha
l.FreeHGlobal(cArrayPtr);
2. 将 C 语言数组转换为字节数组,再将字节数组转换为
C#
数组。
```c
sha
rp
int[] c
sha
rpArray = new int[10];
int[] cArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
byte[] byteArray = new byte[cArray.Length * sizeof(int)];
Buffer.Block
Copy
(cArray, 0, byteArray, 0, byteArray.Length);
Buffer.Block
Copy
(byteArray, 0, c
sha
rpArray, 0, byteArray.Length);