我需要经常做以下事情(这里可以忽略endianness,我只使用x86):
最后一个并不经常使用。但如果我能用一些不安全的操作来做这件事就会非常有趣。
最快的方法是什么?第一个是最重要的,因为我做的最多,并且使用最多的CPU时间。可能存在不安全的代码(如果速度更快)。
编辑:
Currenlty我正在使用类似的东西将uint复制到字节数组中:
public static void Copy(uint i, byte[] arr, int offset)
{
var v = BitConverter.GetBytes(i);
arr[offset] = v[0];
arr[offset + 1] = v[0 + 1];
arr[offset + 2] = v[0 + 2];
arr[offset + 3] = v[0 + 3];
}
对于反向转换,我使用它:
BitConverter.ToUInt32(arr, offset)
最后一个是如此少的代码,第一个是这么多,也许有优化。 为了比较,目前我将其转换回来(第二个),然后我将uint与我想要比较的值进行比较:
BitConverter.ToUInt32(arr, offset) == myVal
对于第四部分(提取结构)我使用的是这样的东西:
[StructLayout(LayoutKind.Explicit, Size = 12)]
public struct Bucket
{
[FieldOffset(0)]
public uint int1;
[FieldOffset(4)]
public uint int2;
[FieldOffset(8)]
public byte byte1;
[FieldOffset(9)]
public byte byte2;
[FieldOffset(10)]
public byte byte3;
[FieldOffset(11)]
public byte byte4;
}
public static Bucket ExtractValuesToStruct(byte[] arr, int offset)
{
var b = new Bucket();
b.int1 = BitConverter.ToUInt32(arr, offset);
b.int2 = BitConverter.ToUInt32(arr, offset + 4);
b.byte1 = arr[offset + 8];
b.byte2 = arr[offset + 9];
b.byte3 = arr[offset + 10];
b.byte4 = arr[offset + 11];
return b;
}
我认为使用不安全的代码我应该能够一次复制12个字节。
答案 0 :(得分:3)
unsafe public static void UnsafeCopy(uint i, byte[] arr, int offset)
{
fixed (byte* p = arr)
{
*((uint*)(p + offset)) = i;
}
}
public static void ShiftCopy(uint i, byte[] arr, int offset)
{
arr[offset] = (byte)(i & 0xFF);
arr[offset + 1] = (byte)((i >> 8) & 0xFF);
arr[offset + 2] = (byte)((i >> 16) & 0xFF);
arr[offset + 3] = (byte)((i >> 24) & 0xFF);
}
00:00:00.0414024: copy. get bytes
00:00:00.0136741: unsafe copy
00:00:00.0154764: shift copy