检查字节是否为0x00

5
这个方法最易读(且符合惯用语)的写法是什么?
private bool BytesAreValid(byte[] bytes) {
    var t = (bytes[0] | bytes[1] | bytes[2]);
    return t != 0;
}

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

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


1
你介意将帖子中的“最佳方式”一词替换为“最易读/最紧凑代码/最快代码”或其他明确定义的更好标准吗?(在此期间考虑删除标题中的标签)。 - Alexei Levenkov
3个回答

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并回答。 - BuddyJoe

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

2
或类似的 'bytes.Take(3).Any(b => b!=0);' - erikH

2

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

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

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

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

如果存在任何一个 0,则返回 false - Ken Kin
如果数组包含一个等于零的值或者数组为空,则返回false(无效)。 - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接