繁体   English   中英

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

[英]checksum calculation using ArraySegment<byte>

我对以下方法有疑问-我不明白为什么它的行为方式如此

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来自哪里? 有人可以澄清一下吗? 谢谢。

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

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

如果看的话, BitArray 所有构造函数都是这样读取的。 不过,我根本不明白为什么需要使用BitArray类。 只需使用一个byte来存储您的XOR结果:

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;
}

我也不认为您也不需要ArraySegment<T> (不是针对所提供的代码),但是我将其保留为原样,因为它不在问题的重点之列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM