2013-02-28 12 views
5

Qual è il più leggibile (e idiomatica) per scrivere questo metodo?Verificando byte sono 0x00

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

Ho bisogno di una funzione che mette alla prova i primi tre byte di un file che non è cominciare 00 00 00.

Non ho eseguito molta manipolazione dei byte. Il codice sopra non sembra corretto per me, dal momento che t è dedotto dal tipo Int32.

+1

ti dispiacerebbe sostituire "modo migliore" nel post con una sola di "più leggibile"/"codice più compatto"/"codice più veloce" o qualsiasi altro criterio "migliore" ben definito? (Prendi in considerazione la possibilità di rimuovere tag dal titolo mentre ci sei). –

+0

+1 - buone idee – BuddyJoe

risposta

14

t è di tipo-dedotta per essere un Yup Int32

, perché il | operatore (come la maggior parte degli operatori) non è definito per byte - i byte sono promossi al int valori. (Vedere la sezione 7.11.1 della specifica C# 4 per i dettagli.)

Ma dato che si desidera solo confrontarlo con 0, va bene comunque.

Personalmente avevo appena lo scrivo come:

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

O anche:

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

Entrambi questi sembrano più chiaro per me.

+0

Sapeva che c'era un modo migliore per ripulirlo. Grazie. +1 e rispondi. – BuddyJoe

2

di anticipare le lunghezze degli array di variabili e evitare Indicazione eccezioni riferimento null:

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

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

non Linq versione:

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

In modo che restituisca 'false' se esiste qualche' 0'? –

+0

Sì, restituisce false (non valido) se l'array contiene un valore uguale a zero o se l'array è nullo. – Tim

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

O 'byte.Take (3) .Any qualsiasi (b => b! = 0);' – erikH

+0

Meglio. Grazie! –

+0

Tecnica impressionante. +1 – BuddyJoe

Problemi correlati