2013-02-28 86 views
5

编写此方法的最可读性(和惯用)是什么?检查字节是否为0x00

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

我需要在此进行测试的前三个字节,它不是与00 00 00开始文件的功能。

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

+1

你不介意在后一个取代“最佳途径” “最易读”/“最紧凑的代码”/“最快的代码”或任何其他明确定义的“更好”的标准? (考虑在你阅读时从标题中删除标签)。 – 2013-02-28 19:44:52

+0

+1 - 好主意 – BuddyJoe 2013-02-28 19:47:14

回答

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

这两个似乎更清楚我。

+0

知道有一个更好的方法来清理。谢谢。 +1并回答。 – BuddyJoe 2013-02-28 19:37:24

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

因此,如果存在任何'0',那么返回'false'? – 2013-02-28 20:01:21

+0

是的,如果数组包含一个等于零的值或数组为null,则返回false(无效)。 – Tim 2013-02-28 20:11:49

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 2013-02-28 22:16:19

+0

更好。谢谢! – 2013-02-28 23:17:29

+0

令人敬畏的技术。 +1 – BuddyJoe 2013-02-28 23:27:58