A mio parere, si vuole fare attenzione facendo questo. Il motivo per cui si vorrebbe convertire da BigEndian a LittleEndian è se i byte letti sono in BigEndian e il calcolo del sistema operativo contro di essi funziona in LittleEndian.
C# non è più una lingua di sola finestra. Con porte come Mono, e anche altre piattaforme Microsoft come Windows Phone 7/8, Xbox 360/Xbox One, Windwos CE, Windows 8 Mobile, Linux con MONO, Apple con MONO, ecc. È possibile che la piattaforma operativa sia in BigEndian, nel qual caso ti vergognerai se hai convertito il codice senza fare alcun controllo.
Il BitConverter dispone già di un campo denominato "IsLittleEndian" che è possibile utilizzare per determinare se l'ambiente operativo è in LittleEndian oppure no. Quindi puoi fare l'inversione in modo condizionale.
Come tale, in realtà ho appena scritto alcuni byte [] estensioni, invece di fare una grande classe:
/// <summary>
/// Get's a byte array from a point in a source byte array and reverses the bytes. Note, if the current platform is not in LittleEndian the input array is assumed to be BigEndian and the bytes are not returned in reverse order
/// </summary>
/// <param name="byteArray">The source array to get reversed bytes for</param>
/// <param name="startIndex">The index in the source array at which to begin the reverse</param>
/// <param name="count">The number of bytes to reverse</param>
/// <returns>A new array containing the reversed bytes, or a sub set of the array not reversed.</returns>
public static byte[] ReverseForBigEndian(this byte[] byteArray, int startIndex, int count)
{
if (BitConverter.IsLittleEndian)
return byteArray.Reverse(startIndex, count);
else
return byteArray.SubArray(startIndex, count);
}
public static byte[] Reverse(this byte[] byteArray, int startIndex, int count)
{
byte[] ret = new byte[count];
for (int i = startIndex + (count - 1); i >= startIndex; --i)
{
byte b = byteArray[i];
ret[(startIndex + (count - 1)) - i] = b;
}
return ret;
}
public static byte[] SubArray(this byte[] byteArray, int startIndex, int count)
{
byte[] ret = new byte[count];
for (int i = 0; i < count; ++i)
ret[0] = byteArray[i + startIndex];
return ret;
}
Quindi immaginate questo codice di esempio:
byte[] fontBytes = byte[240000]; //some data loaded in here, E.G. a TTF TrueTypeCollection font file. (which is in BigEndian)
int _ttcVersionMajor = BitConverter.ToUint16(fontBytes.ReverseForBigEndian(4, 2), 0);
//output
_ttcVersionMajor = 1 //TCCHeader is version 1
Skeet ha scritto uno: http: // www.yoda.arachsys.com/csharp/miscutil/ –
@HansPassant, questa sarà una di quelle DLL che mi richiedono di rendere il mio codice open source? Perché alcune dll lo richiedono? – mowwwalker
Walkerneo Ho cancellato la mia risposta perché zmbq ha risposto essenzialmente la stessa cosa 3 minuti prima di me. Il concetto di endianness non si applica agli array di byte, solo a parole, dwords, qwords, ecc., Cioè a gruppi di 2, 4, 8 e così via byte. Mi dispiace se significherebbe cambiare un sacco di codice, ma un uomo deve fare quello che un uomo deve fare. –