То, о чем вы говорите, называется Endianness , в частности формат Little Endian.
В C #, вероятно, проще всего использовать BinaryReader
или BinaryWriter
для чтения из двоичных файлов, которые содержат правильное преобразование порядка байтов.
В следующем примере показано, как использовать BinaryReader
для получения правильной целочисленной интерпретации числа в LittleФормат Endian:
using System.IO;
class EndiannessSample
{
static void Main(string[] args)
{
using (MemoryStream ms = new MemoryStream())
{
// write bytes in little-endian format
ms.WriteByte(0xEB);
ms.WriteByte(0x03);
ms.WriteByte(0x00);
ms.WriteByte(0x00);
ms.Position = 0;
using (BinaryReader reader = new BinaryReader(ms))
{
int i = reader.ReadInt32(); // decimal value of i is 1003
}
}
}
}
Littleian является стандартом на платформах Intel (и Windows).В случае, если вам приходится работать с данными в формате Big Endian (например, при импорте файлов, созданных на старом Macintosh), прямая поддержка в .NET отсутствует.Вы можете написать простую вспомогательную функцию для преобразования порядка байтов, используя класс BitConverter
.В приведенном выше примере вы можете сделать следующее, чтобы справиться с Big Endian (на платформе Little Endian):
using (MemoryStream ms = new MemoryStream())
{
// write bytes in big-endian format
ms.WriteByte(0x00);
ms.WriteByte(0x00);
ms.WriteByte(0x03);
ms.WriteByte(0xEB);
ms.Position = 0;
using (BinaryReader reader = new BinaryReader(ms))
{
byte[] temp = reader.ReadBytes(4);
if (BitConverter.IsLittleEndian)
{
// reverse the byte order only if we are on a little-endian system,
// because the BitConverter is aware of the endianness of the system
//
Array.Reverse(temp);
}
int i = BitConverter.ToInt32(temp, 0);
}
}
LukeH предоставил ссылку, которая дополнительно обсуждает проблемы, связанные с Endianness, напримерпри нацеливании на Xbox 360 (которая является платформой Big Endian):
One Little, Two Little, Three Little Endian ... 0x0A Ошибки Big Endian
Обновление
Библиотека MiscUtil предоставляет двоичный класс чтения / записи, который можно настроитьдля определенного Endianness:
MiscUtil.IO.EndianBinary{Writer/Reader}