我需要将UInt16和UInt64中的值作为Byte[]。目前我正在使用BitConverter.GetBytes,但是这个方法每次都给我一个新的数组实例。
我想使用一种方法,允许我将这些值“复制”到已经存在的数组,如下所示:
.ToBytes(UInt64 value, Byte[] array, Int32 offset);
.ToBytes(UInt16 value, Byte[] array, Int32 offset);我一直在查看带有.NET的ILSpy源代码,但我不太确定这段代码是如何工作的,以及如何安全地修改它以满足我的要求:
public unsafe static byte[] GetBytes(long value)
{
byte[] array = new byte[8];
fixed (byte* ptr = array)
{
*(long*)ptr = value;
}
return array;
}哪种方式才是实现这一目标的正确途径?
更新:我不能使用不安全的代码。它不应该创建新的数组实例。
发布于 2014-04-14 10:15:14
你可以这样做:
static unsafe void ToBytes(ulong value, byte[] array, int offset)
{
fixed (byte* ptr = &array[offset])
*(ulong*)ptr = value;
}用法:
byte[] array = new byte[9];
ToBytes(0x1122334455667788, array, 1);只能以字节为单位设置偏移量。
如果你想要有管理的方式去做这件事:
static void ToBytes(ulong value, byte[] array, int offset)
{
byte[] valueBytes = BitConverter.GetBytes(value);
Array.Copy(valueBytes, 0, array, offset, valueBytes.Length);
}或者你可以自己填值:
static void ToBytes(ulong value, byte[] array, int offset)
{
for (int i = 0; i < 8; i++)
{
array[offset + i] = (byte)value;
value >>= 8;
}
}发布于 2020-01-13 08:31:07
既然.NET添加了Span<T>支持,以便更好地处理数组、非托管内存等而不需要过多的分配,那么他们还添加了System.Buffer.Binary.BinaryPrimitives。
这是您想要的,例如WriteUInt64BigEndian有这样的签名:
public static void WriteUInt64BigEndian (Span<byte> destination, ulong value);这就避免了分配。
发布于 2014-04-14 10:27:40
您说要避免创建新数组,并且不能使用不安全。要么使用Ulugbek Umirov对缓存数组的回答(注意线程问题),要么:
static void ToBytes(ulong value, byte[] array, int offset) {
unchecked {
array[offset + 0] = (byte)(value >> (8*7));
array[offset + 1] = (byte)(value >> (8*6));
array[offset + 2] = (byte)(value >> (8*5));
array[offset + 3] = (byte)(value >> (8*4));
//...
}
}https://stackoverflow.com/questions/23057284
复制相似问题