2013-02-28 19 views
5

Was ist am besten lesbar (und idiomatisch), um diese Methode zu schreiben?Überprüfen, ob Bytes 0x00 sind

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

Ich brauche eine Funktion, die die ersten drei Bytes einer Datei prüft, dass es nicht mit 00 00 00 beginnen wird.

Habe nicht viel Byte-Manipulation getan. Der obige Code scheint mir nicht korrekt zu sein, da t vom Typ Int32 abgeleitet wird.

+1

Habe Sie etwas dagegen "besten Weg" in der Post zu ersetzen mit einer von "am besten lesbaren"/"kompaktesten Code"/"schnellsten Code" oder anderen gut definierten "besseren" Kriterien? (Ziehen Sie in Betracht, Tags aus dem Titel zu entfernen, während Sie gerade dabei sind). –

+0

+1 - gute Ideen – BuddyJoe

Antwort

14

t typ gefolgert ein Int32

Yup sein, da die Bediener | (wie die meisten Operatoren) nicht für byte definiert ist - der Bytes gefördert int Werte. (Siehe Abschnitt 7.11.1 der C# 4 Spezifikation für Details.)

Aber da Sie es nur mit 0 vergleichen wollen, ist das in Ordnung.

Persönlich würde ich schreibe es genauso:

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

Oder auch:

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

Beide scheinen klarer zu mir.

+0

Wusste, es gab einen besseren Weg, um das aufzuräumen. Vielen Dank. +1 und antwort. – BuddyJoe

2

variable Array Längen zu antizipieren und null Bezug Ausnahmen vermeiden:

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

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

Non-Linq-Version:

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

Also, dass 'false' zurückgibt, wenn eine '0' existiert? –

+0

Ja, es gibt false (nicht gültig) zurück, wenn das Array einen Wert enthält, der gleich Null ist oder wenn das Array null ist. – Tim

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

Oder ähnliche 'Bytes.Nehmen (3) .Any (b => b! = 0);' – erikH

+0

Besser. Vielen Dank! –

+0

Ehrfürchtige Technik. +1 – BuddyJoe

Verwandte Themen