如何从字节数组中获取无符号长整数

时间:2013-05-08 10:02:54

标签: c# bytearray long-integer

我有一个来自一台测试设备的传入字节数组。字节数组可以是两个或四个字节长。我编写了以下代码将这些字节数组转换为无符号长整数:

private ulong GetUlongFrom2Bytes(byte MSB, byte LSB)
{
    return (ulong)((MSB << 8) + (LSB));
}

private ulong GetUlongFrom4Bytes(byte MSB, byte msb, byte lsb, byte LSB)
{
    return (ulong)((MSB << 24) + (msb << 16) + (lsb << 8) + (LSB));
}

相反,为了反方向,我做了以下代码:

private byte[] Get4Bytes(ulong parm1)
{
    byte[] retVal = new byte[4];

    retVal[0] = (byte)((parm1 >> 24) & 0xFF);
    retVal[1] = (byte)((parm1 >> 16) & 0xFF);
    retVal[2] = (byte)((parm1 >> 8) & 0xFF);
    retVal[3] = (byte)(parm1 & 0xFF);

    return retVal;
}

private byte[] Get8Bytes(ulong parm1, ulong parm2)
{
    byte[] retVal = new byte[8];

    Array.Copy(Get4Bytes(parm1), 0, retVal, 0, 4);
    Array.Copy(Get4Bytes(parm2), 0, retVal, 4, 4);

    return retVal;
}

我正在尝试调试我的代码来控制这个设备,我只是想在这里通过SO的健全性检查确认这个代码是为我正在尝试做的正确编写的。

2 个答案:

答案 0 :(得分:3)

假设你想要大端编码,那么是的:那没关系。您可以也使用BitConverter,但我认为您是对的 - 它涉及额外的数组分配,并强制系统的字节顺序(通常是小端)。

一般来说,为了简单和高效,我建议这样的代码使用缓冲区/偏移API - 即

private void Write32(ulong value, byte[] buffer, int offset)
{
    buffer[offset++] = (byte)((value >> 24) & 0xFF);
    buffer[offset++] = (byte)((value >> 16) & 0xFF);
    buffer[offset++] = (byte)((value >> 8) & 0xFF);
    buffer[offset] = (byte)(value & 0xFF);
}

答案 1 :(得分:1)

这样就可以了:

static ulong SliceValue(byte[] bytes, int start, int length)
{
    var bytes = bytes.Skip(start).Take(length);

    ulong acc = 0;
    foreach (var b in bytes) acc = (acc * 0x100) + b;

    return acc;
}