如何在C#中将任意大小的字节数组转换为ulong?

Pyt*_*eer 0 c#

考虑使用不同长度的各种字节数组,例如:

byte[] a = new byte[]{0x6};
byte[] b = new byte[]{0x6, 0x33, 0x22};
byte[] c = new byte[]{0x6, 0x33, 0x22, 0x14, 0x47};
Run Code Online (Sandbox Code Playgroud)

如何将这些基本上任何大小的字节数组(大于 8 字节除外)转换为ulong

我知道BitConverterC# 中的类,但你必须始终提供准确的字节数......

can*_*on7 5

您可以使用 for 循环和位移位轻松完成此操作:

public static ulong BytesToUInt64(byte[] bytes)
{
    if (bytes == null)
        throw new ArgumentNullException(nameof(bytes));
    if (bytes.Length > 8)
        throw new ArgumentException("Must be 8 elements or fewer", nameof(bytes));

    ulong result = 0;
    for (int i = 0; i < bytes.Length; i++)
    {
        result |= (ulong)bytes[i] << (i * 8);
    }   
    
    return result;
}
Run Code Online (Sandbox Code Playgroud)

在 SharpLab 上查看

我们获取字节数组中的第一个元素,并result使用按位或将其组合起来。我们取出第二个元素,将其左移 8 位(因此它位于第一个元素的顶部),然后对其进行“或”运算。依此类推,得到剩余的字节。

请注意,这会将索引 0 处的字节置于最低有效位置。您可以摆弄索引bytes和左移来更改此设置。


您还可以通过用 0 填充字节数组来解决此问题。尽管表面上效率较低,但它仍然可能比上面的循环和位移位更便宜(并且更清晰)。有关详细信息,请参阅此问题。