BitConverter.GetBytes到位

vto*_*ola 3 c# arrays byte

我需要得到的值UInt16UInt64作为Byte[].目前我正在使用BitConverter.GetBytes,但这种方法每次都给我一个新的数组实例.

我想使用一种方法,允许我将这些值"复制"到现有的数组,如:

.ToBytes(UInt64 value, Byte[] array, Int32 offset);
.ToBytes(UInt16 value, Byte[] array, Int32 offset);
Run Code Online (Sandbox Code Playgroud)

我一直在看看使用ILSpy的.NET源代码,但我不太确定这段代码是如何工作的,如何安全地修改它以符合我的要求:

public unsafe static byte[] GetBytes(long value)
{
    byte[] array = new byte[8];
    fixed (byte* ptr = array)
    {
            *(long*)ptr = value;
    }
    return array;
}
Run Code Online (Sandbox Code Playgroud)

这将是实现这一目标的正确方法吗?

更新:我不能使用不安全的代码.它不应该创建新的数组实例.

Ulu*_*rov 7

你可以这样做:

static unsafe void ToBytes(ulong value, byte[] array, int offset)
{
    fixed (byte* ptr = &array[offset])
        *(ulong*)ptr = value;
}
Run Code Online (Sandbox Code Playgroud)

用法:

byte[] array = new byte[9];
ToBytes(0x1122334455667788, array, 1);
Run Code Online (Sandbox Code Playgroud)

您只能以字节为单位设置偏移量.

如果您想要托管方式:

static void ToBytes(ulong value, byte[] array, int offset)
{
    byte[] valueBytes = BitConverter.GetBytes(value);
    Array.Copy(valueBytes, 0, array, offset, valueBytes.Length);
}
Run Code Online (Sandbox Code Playgroud)

或者您可以自己填写值:

static void ToBytes(ulong value, byte[] array, int offset)
{
    for (int i = 0; i < 8; i++)
    {
        array[offset + i] = (byte)value;
        value >>= 8;
    }
}
Run Code Online (Sandbox Code Playgroud)