2013-02-28 28 views
5

このメソッドを書くのに最も読みやすい(そして慣用的な)ものは何ですか?バイトが0x00であるかどうかを調べる

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

は、私はそれが00 00 00で始まっていないファイルの最初の3つのバイトをテストする機能を必要としています。

多くのバイト操作を行っていません。上記のコードはtInt32と推測されているので私にとっては正しいとは思われません。バイトはint値に昇格されている -

+1

あなたは1でポストに「最善の方法」を交換する気だろう「最も読みやすい」/「最もコンパクトなコード」/「最速のコード」など、よく定義された「より良い」基準のいずれか? (あなたがそれにいる間、タイトルからタグを削除することを検討する)。 –

+0

+1 - 良いアイデア – BuddyJoe

答えて

14

tは、タイプ推論(最もオペレータなど)|オペレータがbyteのために定義されていないため、Int32

うんことがあります。 (詳細は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); 

これらのいずれもが、私には明確に見えます。変数配列の長さを予測し、null参照の例外を避けるために

+0

それをきれいにする良い方法があることが分かっていました。ありがとう。 +1と答え。 – BuddyJoe

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'を返しますか? –

+0

はい、配列にゼロに等しい値が含まれている場合、または配列がnullの場合はfalse(無効)を返します。 – Tim

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

+0

ありがとうございました! –

+0

素晴らしい技術。 +1 – BuddyJoe

関連する問題