2

テスト機器から受信バイト配列があります。バイト配列の長さは、2 バイトまたは 4 バイトのいずれかです。これらのバイト配列を unsigned long に変換する次のコードを書きました。

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 で皆さんからサニティ チェックをお願いします。

4

2 に答える 2

4

ビッグエンディアンのエンコーディングが必要だと仮定すると、はい: それで問題ありません。を使用することもでき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);
}
于 2013-05-08T10:06:09.577 に答える
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;
}
于 2013-05-08T10:18:59.670 に答える