检查字节是否为0x00

时间:2013-02-28 19:32:20

标签: c# bytearray byte bit-manipulation

编写此方法的最具可读性(和惯用法)是什么?

private bool BytesAreValid(byte[] bytes) {
    var t = (bytes[0] | bytes[1] | bytes[2]);
    return t != 0;
}

我需要一个函数来测试文件的前三个字节,它不是以00 00 00开头的。

没有做太多的字节操作。上面的代码对我来说似乎不正确,因为t是推断类型Int32

3 个答案:

答案 0 :(得分:14)

  

t的类型推断为Int32

是的,因为没有为|定义byte运算符(与大多数运算符一样) - 字节被提升为int值。 (有关详细信息,请参阅C#4规范的第7.11.1节。)

但是考虑到你只想将它与0进行比较,那无论如何都很好。

就我个人而言,我只想把它写成:

return bytes[0] != 0 && bytes[1] != 0 && bytes[2] != 0;

甚至:

return (bytes[0] != 0) && (bytes[1] != 0) && (bytes[2] != 0);

这些对我来说都更清楚。

答案 1 :(得分:3)

private bool BytesAreValid(byte[] bytes) {
    return !bytes.Take(3).SequenceEqual(new byte[] { 0, 0, 0 });
}

答案 2 :(得分:2)

预测变量数组长度并避免空引用异常:

private bool BytesAreValid(byte[] bytes)
{
    if (bytes == null) return false;

    return !Array.Exists(bytes, x => x == 0);
}

Non-Linq版本:

private bool BytesAreValid(byte[] bytes)
{
    if (bytes == null) return false;

    for (int i = 0; i < bytes.Length; i++)
    {
        if (bytes[i] == 0) return false;
    }
    return true;
}