2013-02-28 10 views
5

Co jest najbardziej czytelne (i idiomatyczne) do napisania tej metody?Sprawdzanie, czy liczba bajtów wynosi 0x00

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

muszę funkcję, która testuje pierwsze trzy bajty pliku, że nie Rozpocznijmy 00 00 00.

Nie wykonałem zbyt wielu operacji na bajtach. Powyższy kod wydaje mi się niepoprawny, ponieważ t wywodzi się z typu Int32.

+1

Mógłbyś wymienić „najlepszym sposobem” na stanowisku z jednego "najbardziej czytelnego"/"najbardziej kompaktowego kodu"/"najszybszego kodu" lub innych dobrze zdefiniowanych "lepszych" kryteriów? (Rozważ usunięcie znaczników z tytułu, gdy jesteś przy nim). –

+0

+1 - dobre pomysły – BuddyJoe

Odpowiedz

14

t TYPE-wywnioskować być Int32

Tak, ponieważ operator | (jak większość operatorów) nie jest określona za byte - bajty są wspierane na int wartości. (Szczegółowe informacje znajdują się w sekcji 7.11.1 specyfikacji C# 4).

Ale biorąc pod uwagę, że chcesz tylko porównać to z 0, i tak to w porządku.

Osobiście bym po prostu napisać go jako:

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

lub nawet:

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

Oba wydają się jaśniejsze do mnie.

+0

Wiedziałem, że istnieje lepszy sposób na posprzątanie tego. Dzięki. +1 i odpowiedź. – BuddyJoe

2

przewidywać zmiennej długości tablicy i uniknąć zerowe wyjątki referencyjne:

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

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

dla LINQ wersja:

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

Tak więc zwracają 'false' jeśli istnieje' 0'? –

+0

Tak, zwraca wartość false (nieważna), jeśli tablica zawiera wartość równą zero lub tablica ma wartość NULL. – Tim

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

Lub podobne "bytes.Take (3). Any (b => b! = 0); ' – erikH

+0

Lepiej. Dziękuję Ci! –

+0

Niesamowita technika. +1 – BuddyJoe

Powiązane problemy