Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将结构的二维数组复制到字节[]_C#_Arrays_Marshalling - Fatal编程技术网

C# 将结构的二维数组复制到字节[]

C# 将结构的二维数组复制到字节[],c#,arrays,marshalling,C#,Arrays,Marshalling,我有这样的想法: [StructLayout(LayoutKind.Explicit)] public struct PixelColorRGBA { [FieldOffset(0)] public UInt32 ColorBGRA; [FieldOffset(0)] public byte Blue; [FieldOffset(1)] public byte Green; [FieldOffset(2)] public byte

我有这样的想法:

[StructLayout(LayoutKind.Explicit)]
public struct PixelColorRGBA
{
    [FieldOffset(0)]
    public UInt32 ColorBGRA;
    [FieldOffset(0)]
    public byte Blue;
    [FieldOffset(1)]
    public byte Green;
    [FieldOffset(2)]
    public byte Red;
    [FieldOffset(3)]
    public byte Alpha;
}
像素颜色RGBA[w,h]
复制到
字节[w*h*4]
的最快方法是什么,反之亦然?

尝试以下方法

    PixelColorRGBA[,] source = ...;
    byte[] dest = source
        .Cast<PixelColorRGBA>()
        .SelectMany(x => new byte[] { x.Blue, x.Green, x.Red, x.Alpha })
        .ToArray();
PixelColorRGBA[,]源=。。。;
字节[]dest=源
.Cast()
.SelectMany(x=>newbyte[]{x.Blue,x.Green,x.Red,x.Alpha})
.ToArray();
您可以使用

System.Buffer.BlockCopy(myArray, 0, byteArray, 0, length) 


我最终得到以下代码:

var source = new PixelColorRGBA[1000, 1000];
var destination = new byte[4000000];
{
    var start = DateTime.Now;
    unsafe
    {
        for (var q = 0; q < 100; q++)
            fixed (PixelColorRGBA* tmpSourcePtr = &source[0, 0])
            {
                var sourcePtr = (IntPtr) tmpSourcePtr;
                Marshal.Copy(sourcePtr, destination, 0, 4000000);
            }
    }
    Console.WriteLine("MS: " + DateTime.Now.Subtract(start).TotalMilliseconds);
}
var source=new pixelcorrgba[10001000];
var destination=新字节[4000000];
{
var start=DateTime.Now;
不安全的
{
对于(var q=0;q<100;q++)
已修复(PixelColorRGBA*tmpSourcePtr=&源[0,0])
{
var sourcePtr=(IntPtr)tmpSourcePtr;
封送处理副本(源PTR,目标,4000000);
}
}
WriteLine(“MS:+DateTime.Now.Subtract(start.total毫秒));
}

在我的电脑上需要62毫秒。

@breethe这是打字最快的;)这就是我要找的!谢谢
var source = new PixelColorRGBA[1000, 1000];
var destination = new byte[4000000];
{
    var start = DateTime.Now;
    unsafe
    {
        for (var q = 0; q < 100; q++)
            fixed (PixelColorRGBA* tmpSourcePtr = &source[0, 0])
            {
                var sourcePtr = (IntPtr) tmpSourcePtr;
                Marshal.Copy(sourcePtr, destination, 0, 4000000);
            }
    }
    Console.WriteLine("MS: " + DateTime.Now.Subtract(start).TotalMilliseconds);
}