[英]In C#, convert ulong[64] to byte[512] faster?
我有一种方法可以使用for语句中的二进制移位将ulongs转换为字节,但它的效率不是很高。 有没有办法将大小为64的ulong
数组直接转换为大小为512的字节数组? 这是一段运行数千次的代码,我需要保存每毫秒,以便我可以节省几秒钟。
编辑:现在这就是我正在做的事情:
for (int k = 0; k < ulongs.Length; k++) {
bytes[(k << 3)] = (byte)(ulongs[k] >> 56);
bytes[(k << 3) + 1] = (byte)(ulongs[k] >> 48);
bytes[(k << 3) + 2] = (byte)(ulongs[k] >> 40);
bytes[(k << 3) + 3] = (byte)(ulongs[k] >> 32);
bytes[(k << 3) + 4] = (byte)(ulongs[k] >> 24);
bytes[(k << 3) + 5] = (byte)(ulongs[k] >> 16);
bytes[(k << 3) + 6] = (byte)(ulongs[k] >> 8);
bytes[(k << 3) + 7] = (byte)(ulongs[k]);
}
unsafe
{
fixed (ulong* src = ulongs)
{
Marshal.Copy(new IntPtr((void*)src), bytes, 0, 512);
}
}
这似乎有效。 我不确定是否需要修复,但在定时测试期间我丢失了一整秒。
可能最快的方法是使用unsafe
和fixed
结构。 这是一个例子:
ulong[] ulongs = new ulong[64];
byte[] bytes = new byte[512];
unsafe
{
fixed (ulong* src = ulongs)
{
byte* pb = (byte*)src;
for (int i = 0; i < bytes.Count(); i++)
{
bytes[i] = *(pb + i);
}
}
}
编译上面的代码时,请不要忘记使用/unsafe
编译器开关。
编辑:这是第一个代码片段的修改版本,它在我的机器上运行得更快:
unsafe
{
fixed (ulong* src = ulongs)
{
fixed (byte *dst = bytes)
{
ulong* pl = (ulong*)dst;
for (int i = 0; i < ulongs.Count(); i++)
{
*(pl + i) = *(src + i);
}
}
}
}
您可以使用struct
和显式布局指令来实现此目的,使用StructLayout
属性来强制变量占用相同的空间。
这样你就可以使用ulong
属性编写值,并使用byte
array属性读取它。 当然,这假设byte
数组真正占用了您期望的空间,并且它没有使用32位来保存8位信息。 我将不得不在规范中查看,我还没有完成。
使用System.Buffer帮助程序类。
ulong[] buffer = null;
int byteLength = Buffer.ByteLength(buffer);
byte[] byteBuffer = new byte[byteLength];
Buffer.BlockCopy(buffer, 0, byteBuffer, 0, byteLength);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.