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);
}