2014-09-26 6 views
0

я должен прочитать двоичный файл, поэтому я использую этот код:C# - BinaryReader и Little Endian

static void ReadBin() 
     { 
      var sectors = new List<Sector>(); 
      using (var b = new BinaryReader(File.Open("C:\\LOG.BIN", FileMode.Open))) 
      { 
       const int offset = 4096; 
       const int required = 2; 
       int pos = 0; 
       var length = (int)b.BaseStream.Length; 
       while (pos < length) 
       { 
        for (int i = 1; i <= 640; i++) 
        { 
         pos = (offset*i)-2; 
         b.BaseStream.Seek(pos, SeekOrigin.Begin); 
         // Read the next 2 bytes. 
         byte[] by = b.ReadBytes(required); 
         sectors.Add(new Sector { Number = i, Position = pos, Type = Sector.SetTypeFromExadecimalString(ByteArrayToString(@by)) }); 
         pos = pos + 2; 
        } 
       } 
      } 
     } 

Как вы можете видеть ByteArrayToString взять массив байт и записать строку. Код ByteArrayToString является:

public static string ByteArrayToString(byte[] ba) 
    { 
     StringBuilder hex = new StringBuilder(ba.Length * 2); 
     foreach (byte b in ba) 
      hex.AppendFormat("{0:x2}", b); 
     return string.Format("0x{0}", hex.ToString().ToUpper()); 
    } 

машина, записать файл .bin записать его в LittleEndian. Итак, следуя этому потоку StackOverflow «Is .NET BinaryReader always little-endian, even on big-endian systems?« Я должен быть в «всем» LittleEndian формате (ReadBytes, а также файл, созданный машиной). Проблема в том, что функция ByteArrayToString() дает мне этот результат: 0xF0FF, который находится в BigEndian, а не в LittleEndian (infact, я полагаю, что я должен получить вместо 0xFFF0), потому что после этого мне нужно декодировать много данных, и я могу (я не имею никакого сравнения), я не хочу иметь проблему для декодирования .bin-файла, как я могу добиться обхода 0xFFF0?

ответ

1

Адресат BinaryReader влияет только на методы, такие как ReadInt32. Он не влияет на ReadBytes - это будет всегда возвращает байты в том порядке, в котором они происходят внутри потока.

Если вам нужен массив байтов (или его шестнадцатеричное представление) в определенном порядке, вам придется выполнить этот заказ самостоятельно.

Если файл предназначен для уже в том, что вы хотите, то вполне возможно, что вы просто читаете неправильные данные. Я бы не был полностью этому удивлен - вы перемещаете базовый поток, о котором может не знать BinaryReader. Если он прочитал (скажем) 16 байт в свой буфер, он может не читать из потока снова, пока вы не прочтете весь этот буфер. Я предлагаю вам принять BinaryReader из уравнения и просто использовать Stream - нетрудно написать собственный эквивалент ReadBytes, который просто зацикливается до тех пор, пока он не исчерпает данные или не прочитает все необходимые данные.

+0

Jom, спасибо, что ответ. К сожалению, что-то довольно странно ... Фрагмент, который я предоставляю, вставлен в большой проект, я должен прочитать подпись 640 секторов файла. Каждый сектор может быть «подписан» с 4 значениями. Ну, я могу иметь только один сектор, подписанный 0xFFF0 в формате Little Endian. Теперь остальные 639 секторов просто прекрасны, поэтому совершенно невозможно, чтобы я прочитал неверные данные (в противном случае другой сектор должен быть ошибочным). Инструмент, который генерирует файл, я уверен, что пишу в формате LittleEndian. Возможно, когда я скопирую его на свои машины (по USB), изменится формат endian? – pinguinone

+0

@pinguinone: Это звучит очень маловероятно для меня. Вы должны посмотреть на файл с помощью редактора двоичных файлов, чтобы точно проверить, что там есть ... и не предполагайте, что что-то «совершенно невозможно», пока вы не разработали то, что на самом деле происходит. –

Смежные вопросы