在C#中,如何使用字节*指针编写指向文件流的数组,而不使用封送处理进行复制?

在C#中,如何使用字节*指针编写指向文件流的数组,而不使用封送处理进行复制?,c#,pointers,file-io,filestream,C#,Pointers,File Io,Filestream,我使用的是制造商的摄像头SDK,他们给了我一个名为Image的类,其中有一个名为data的指针,类型为byte*,指向图像数据的开头。他们还给我一个名为dataSize的uint,对应于数据的长度 现在,我想使用FileStream将其写入一个文件,但不幸的是FileStream中唯一的写入函数是signaturewrite(Byte[]), Int32, Int32)。当然,如果我尝试使用数据作为写入(…)的参数,它会告诉我无法从字节*转换为字节[] 因为在我的应用程序中,性能至关重要,所以我

我使用的是制造商的摄像头SDK,他们给了我一个名为
Image
的类,其中有一个名为
data
的指针,类型为
byte*
,指向图像数据的开头。他们还给我一个名为
dataSize
uint
,对应于
数据的长度

现在,我想使用FileStream将其写入一个文件,但不幸的是FileStream中唯一的写入函数是signature
write(Byte[]), Int32, Int32)
。当然,如果我尝试使用
数据
作为
写入(…)
的参数,它会告诉我无法从
字节*
转换为
字节[]

因为在我的应用程序中,性能至关重要,所以我希望避免使用本文建议的
Marshal.Copy(…)
将数据复制到
byte[]
数组中

我还可以使用哪些其他选项来获取此
字节*
指针并将其写入文件?请注意,我的总体目标是以每秒数千次的速度拍摄这些图像,并尽快将它们写入磁盘(即按顺序写入SSD)。

查看类型:


我认为问题在于,如果不经过复制到新的托管块的过程,就无法将非托管内存转换为托管内存。如果内存使用是一个问题,您是否可以使用缓冲区写入文件,以便将额外的内存使用限制为缓冲区的大小?我担心在写入数据之前将数据复制到托管块会对性能造成影响。这似乎效率太低了。在C++中实现一些文件来写文件会更快(创建一个由C调用的包装器)?听起来是个不错的方法。假设使用C++ + CLI,你应该能够向C++库添加一个引用,并像其他任何C类一样使用它。这可能是简单的实现方式。我将注意到,这并不能避免分配一个
字节[]
它只是将其隐藏在
CopyTo
中。不过,它将使用一个缓冲区(默认大小为81920),该缓冲区几乎不会同时分配整个图像需要保存在内存中的内容。
Image cameraData = YourSDKFunction();
using (var camera = new UnmanagedMemoryStream(cameraData.data, (int64)cameraData.dataSize))
using (var outFile = new FileStream("outputFile.jpg"))
{
     camera.CopyTo(outFile);
}