По-моему, вы хотите быть осторожными при этом.Причина, по которой можно захотеть конвертировать из BigEndian в LittleEndian, заключается в том, что считываемые байты находятся в BigEndian, а ОС, рассчитывающая их, работает в LittleEndian.
C # больше не является языком только для окон.С такими портами, как Mono, а также с другими платформами Microsoft, такими как Windows Phone 7/8, Xbox 360 / Xbox One, Windwos CE, Windows 8 Mobile, Linux с MONO, Apple с MONO и т. Д. Вполне возможно, что операционная платформа может быть вBigEndian, и в этом случае вы бы сами себя испортили, если преобразовали код без каких-либо проверок.
В BitConverter уже есть поле под названием «IsLittleEndian», которое можно использовать, чтобы определить, является ли операционная средав LittleEndian или нет.Затем вы можете сделать реверсирование условно.
Поэтому я просто написал несколько расширений byte [] вместо создания большого класса:
/// <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;
}
Итак, представьте пример кода:
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