c#中指针转换成数组

tiancai1912 2016-08-18 11:09:01
c++下dll有一个接口,参数是BYTE*类型的,传入的一帧帧图像数据,我在c#中用intptr类型接收后我想转换成byte[]类型数组,查找资料发现可以使用marshal中copy函数,将intptr内容拷贝到byte[]中,可是如果我不想使用这个copy函数,想像c++下一样直接用intptr指向的那块地址操作数据怎么办?

我自己的思路是:
(1)在c#下将intptr参数改成byte[]去接收c++下的BYTE*指针,发现接收到的只是一个指针值,并不能转换成数组,也就是说我不能对传进来的这个byte[]进行操作,不然直接报“受保护的内存被读写”这样的错误。
(2)在c#下还是用intptr去接收,然后使用topointer()方法,用void*data = intptr.Topointer();这样得到void*值,再转换成byte*,这样就可以像c++一样操作数据块,可是这段c#下操作指针又是不安全的,所以也放弃了。

跪求各位大大,请问有什么方法可以直接操作c++转过来的指针数据,或是可以将intptr转换成byte[]数组的方法。
...全文
1666 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigbaldy 2016-08-19
  • 打赏
  • 举报
回复 1
谁告诉你不提倡了?.net库本身就大量unsafe,微软官方给的很多示例代码也都是unsafe的,用unsafe就是为了提高性能或者与C交互能够更加简单,楼主真是强迫症
tiancai1912 2016-08-19
  • 打赏
  • 举报
回复
引用 9 楼 xuzuning 的回复:
C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源 byte[] 是 C# 的托管类型 两者不能直接沟通 在 C# 的 unsafe 下,你可以用指针直接去访问 C++ 的指针 但你要用 byte[] 的话,就要有 Marshal.Copy 从别人口袋里拿,是不保险的 放在自己口袋里,就安心了
昨天看了你们回复的,回去仔细又把c++指针拿出来看了下,发现确实c#和c++数组上面还是存在很大区别的,结贴散分,虽然不多,都是谢意。
beyondma 2016-08-18
  • 打赏
  • 举报
回复
net是托运管的地址空间和普通进程没。所以用copy方法
tiancai1912 2016-08-18
  • 打赏
  • 举报
回复
引用 1 楼 yuankaiwsl 的回复:
1、有copy为什么不用? 2、可以允许不安全代码:项目属性页,生成选项卡中选中“允许不安全代码”即可。
copy之所以不选用是因为(1)既然可以获得类似c++指针这样的一种地址信息,那么就想直接操作这块数据,用了copy进行一次复制操作,觉得这样获取地址了有什么意义呢。 (2)考虑到,我c++传输过来的是一块图像数据的地址,如果每次在c#中要经过copy这样处理才能操作这块图像数据的话,那效率上会出现很大问题,小图片还好,但是分辨率过高,数据过大的话,每次copy会很耗时的吧,除非c#在marshal的copy函数处理时候将效率这方面考虑到了,对于这一点我暂且不知。 你说的第二点,我这样做过了,但是因为毕竟c#不提倡这种做法嘛,并且这样也会带来内存回收处理不当的问题,所以这种方案我觉得不妥。
巴士上的邂逅 2016-08-18
  • 打赏
  • 举报
回复
1、有copy为什么不用? 2、可以允许不安全代码:项目属性页,生成选项卡中选中“允许不安全代码”即可。
xuzuning 2016-08-18
  • 打赏
  • 举报
回复
C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源 byte[] 是 C# 的托管类型 两者不能直接沟通 在 C# 的 unsafe 下,你可以用指针直接去访问 C++ 的指针 但你要用 byte[] 的话,就要有 Marshal.Copy 从别人口袋里拿,是不保险的 放在自己口袋里,就安心了
小程序员 2016-08-18
  • 打赏
  • 举报
回复
用byte[]接收不也是复制了一次么。。。。。你new一个byte[],在内存中开辟了一块地给byte[],然后用这个byte[]来接收数据,不也是把数据从C++分配的A内存复制到byte[]的B内存区么。。。。。 想要不复制,又不用unsafe,你可以把这块代码用C++继续写下去。。。
tiancai1912 2016-08-18
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning 的回复:
虽然 unsafe 被翻译成 不安全的,但实际上是指被操作的内存不受 C# 的保护 但你的指针本来就是 C++ 传入的,你也不可能指望 C# 会去管理 C++ 的内存 如果你一定要 safe 的话,可以 Marshal.Copy 到 C# 中来。只是都用些内存而已
那这样也就是说c++传过来的指针必须得用intptr类型接收了?为什么不可以用byte[]接收呢。如果用byte[]接收,貌似接收到的长度始终为1,只有首字节地址的值,为什么不像c++那样,直接获得一整块内存的数据呢?这一点我一直不清楚,
xuzuning 2016-08-18
  • 打赏
  • 举报
回复
虽然 unsafe 被翻译成 不安全的,但实际上是指被操作的内存不受 C# 的保护 但你的指针本来就是 C++ 传入的,你也不可能指望 C# 会去管理 C++ 的内存 如果你一定要 safe 的话,可以 Marshal.Copy 到 C# 中来。只是都用些内存而已
tiancai1912 2016-08-18
  • 打赏
  • 举报
回复
引用 4 楼 BEYONDMA 的回复:
net是托运管的地址空间和普通进程没。所以用copy方法
你说的这个不是太清楚什么意思,能说的具体点吗

110,529

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧