当前位置: 首页 > 编程语言 > C#

IntPtr转字节数组并返回分享

时间:2023-04-10 23:06:00 C#

IntPtr转字节数组并返回引用数据。指针引用从扫描仪设备捕获的图像,因此我还假设捕获此信息应放入字节数组中。我也不确定Marshal.SizeOf()方法是否会返回IntPtr引用的数据的大小或指针本身的大小。我的问题是我收到错误“无法将类型‘System.Byte[]’编组为非托管结构;无法计算有意义的大小或偏移量”IntPtrbmpptr=Twain.GlobalLock(hImage);试试{byte[]_imageTemp=newbyte[Marshal.SizeOf(bmpptr)];Marshal.Copy(bmpptr,_imageTemp,0,Marshal.SizeOf(bmpptr));IntPtrunmanagedPointer=Marshal.AllocHGlobal(Marshal.SizeOf(_imageTemp));尝试{元帅。复制(_imageTemp,0,unmanagedPointer,Marshal.SizeOf(_imageTemp));Gdip.SaveDIBAs(string.Format("{0}\{1}.{2}",CaptureFolder,"Test","jpg"),unmanagedPointer,false);}最后{Marshal.FreeHGlobal(unmanagedPointer);}}catch(Exceptione){Scanner.control.Test=e.Message;}调用SizeOf抛出的异常是正确的;该方法无法知道传递给它的数组长度是多少,它只有一个指针。为此,最简单的获取数据的方法是调用Marshal类的静态Copy方法,传递指向非托管数据的指针、索引和要读取的字节数,以及一个预先分配的字节缓冲区来组织资料入。至于获取数组的大小,正如AntonTykhyy在评论中指出的那样(此处要非常小心)调用Twain.GlobalLock(hImage)正在使用由GlobalAlloc分配的内存,这意味着您可以通过P/创建对GlobalSize的调用调用图层API函数来获取尺寸。如果它不是通过调用GlobalAlloc分配的某些内容的句柄,那么您需要找出Twain模块如何分配内存并使用适当的机制来确定IntPtr指向的内存长度。1-我假设bmpptr已经是一个非托管指针,如果是这样,为什么你需要“往返”回到非托管指针?2-Marshal.SizeOf不会给你非托管内存分配的大小。使用Marshal.Copy,您可以将非托管内存的内容复制到托管字节数组,但您需要知道有多少字节需要从非托管缓冲区移动到托管缓冲区。理想情况下,API应提供此信息。以上就是C#学习教程的全部内容:IntPtr转字节数组及返回分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: