使用ArraySegment <byte>进行校验和计算

时间:2016-11-09 14:00:23

标签: c#

我对以下方法有疑问 - 我不明白它为什么会这样做

private static bool chksumCalc(ref byte[] receive_byte_array)
{
    Console.WriteLine("receive_byte_array -> " + receive_byte_array.Length); //ok,151 bytes in my case
    ArraySegment<byte> segment = new ArraySegment<byte>(receive_byte_array, 0, 149);
    Console.WriteLine("segment # -> " + segment.Count); //ok,149 bytes

    BitArray resultBits = new BitArray(8); //hold the result
    Console.WriteLine("resultBits.Length -> " + resultBits.Length); //ok, 8bits
    //now loop through the 149 bytes
    for (int i = segment.Offset; i < (segment.Offset + segment.Count); ++i)
    {
        BitArray curBits = new BitArray(segment.Array[i]);
        Console.WriteLine("curBits.Length -> " + curBits.Length); //gives me 229 not 8?
        resultBits = resultBits.Xor(curBits);
    }

    //some more things to do  ... return true...
    //or else
    return false;
}

我需要XOR 149个字节而且我不明白为什么segment.Array[i]没有给我1个字节。如果我使用例如segment.Array[1]我有149字节的数组,它必须产生第二个字节或者我错了吗? 229来自哪里?有人可以澄清一下吗?谢谢。

1 个答案:

答案 0 :(得分:3)

这是您正在调用的构造函数:BitArray(int length)

  

初始化BitArray类的新实例,该实例可以保存指定数量的位值,这些位值最初设置为false。

如果你看,BitArray BitArray就是这样读的。我不明白为什么你需要使用byte类。只需使用private static bool chksumCalc(ref byte[] receive_byte_array) { var segment = new ArraySegment<byte>(receive_byte_array, 0, 149); byte resultBits = 0; for (var i = segment.Offset; i < (segment.Offset + segment.Count); ++i) { var curBits = segment.Array[i]; resultBits = (byte)(resultBits ^ curBits); } //some more things to do ... return true... //or else return false; } 来存储您的XOR结果:

ArraySegment<T>

我认为你不需要<input id="form:inptCode" type="text" name="form:inptCode" class="number"> (不是代码所示的代码),但我保留原样,因为它不在问题的旁边。