考虑使用不同长度的各种字节数组,例如:
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# 中的类,但你必须始终提供准确的字节数......
您可以使用 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)
我们获取字节数组中的第一个元素,并result使用按位或将其组合起来。我们取出第二个元素,将其左移 8 位(因此它位于第一个元素的顶部),然后对其进行“或”运算。依此类推,得到剩余的字节。
请注意,这会将索引 0 处的字节置于最低有效位置。您可以摆弄索引bytes和左移来更改此设置。
您还可以通过用 0 填充字节数组来解决此问题。尽管表面上效率较低,但它仍然可能比上面的循环和位移位更便宜(并且更清晰)。有关详细信息,请参阅此问题。