Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Чтение байтов


Автор: timur85 23.6.2007, 18:20
Здравствуйте smile 
Мучаюсь с таким вот вопросом, очень нужна помощь.
Из двоичного файла необходимо скачать n-кол-во байт.
В классе FileStream есть метод:
Read(byte[] buf,int offset,int numBytes)
Предположим я считал в этот буфер 2 байта. Как этот массив из двух байт преобразовать к типу int?
Нашел вот такое решение, но его не назвать элегантным:

Код

static void Main(string[] args)
        {
            
            System.IO.FileStream file = new System.IO.FileStream("test.me", System.IO.FileMode.Open);

            byte[] arr = new byte[128]; // Буфер
            
            file.Read(arr, 0, 128);

            short tmp;  // Временная переменная для конвертирования
            int takeIt; // Наружу

            // Небезопасный участок кода, позволяющий работать с указателями 
            unsafe
            {
                
                fixed (byte* ptr = &arr[0])
                {
                    // Создаем указатель на short (2 байта)
                    short* ptr2 = (short*)ptr;
                  
                    tmp = ptr2[0];
                }
            }

            // Записываем 2 байта в 4ре )))
            takeIt = tmp;
        }

Существует ли более элегантное решение?
 

Автор: Zeit 23.6.2007, 22:46
Есть еще два класса чтения и записи бинарных файлов, BinaryReader и BinaryWriter, соответственно в классе BinareWriter есть методы для чтения различных типов данных, в т.ч. и для int. ReadInt32, так вроде называется.

Автор: timur85 23.6.2007, 23:39
Да я знаком с этими классами, но они не считывают нужное мне кол-во байт.
В файле поле занимает 4 байта, а мне надо получить значение только из первых 2 байт этого поля.
В этом вся загвоздка... smile 

Автор: Zeit 23.6.2007, 23:59
Ммм, а чем плох сдвиг влево\вправо? Или xor, or?)

Автор: timur85 24.6.2007, 00:02
А каким образом это реализовано в C#?

Автор: stab 24.6.2007, 04:58
пользуйся BinaryReader и будет тебе счатье.

Цитата(timur85 @  24.6.2007,  03:39 Найти цитируемый пост)
В файле поле занимает 4 байта, а мне надо получить значение только из первых 2 байт этого поля.

BinaryReader.ReadInt16 чем не подходит? возвращает как раз так нужный тебе short.

Цитата(timur85 @  24.6.2007,  04:02 Найти цитируемый пост)
А каким образом это реализовано в C#? 

а каким образом это обычно реализовывается? таким же точно и в C#.

Автор: tol05 24.6.2007, 15:11
Код

class Program
  {
    static void Main(string[] args)
    {
      byte[] b1 = new byte[] {1};
      byte[] b2 = new byte[] {1, 1};
      byte[] b3 = new byte[] {1, 1, 1};
      byte[] b4 = new byte[] {1, 1, 1, 1};
      
      MemoryStream ms = new MemoryStream();
      BinaryWriter writer = new BinaryWriter(ms);
      BinaryReader br = new BinaryReader(ms);

      writer.Write(b1);
      writer.Write(b2);
      writer.Write(b3);
      writer.Write(b4);
      
      ms.Position = 0;
      
      byte[] bres1 = br.ReadBytes(1);
      byte[] bres2 = br.ReadBytes(2);
      byte[] bres3 = br.ReadBytes(3);
      byte[] bres4 = br.ReadBytes(4);
      
      int iresult1 = bres1[0];
      int iresult2 = bres2[0] | (bres2[1] << 8);
      int iresult3 = (bres3[0] | (bres3[1] << 8)) | (bres3[2] << 0x10);
      int iresult4 = ((bres4[0] | (bres4[1] << 8)) | (bres4[2] << 0x10)) | (bres4[3] << 0x18);
      
      //или
      ms.Position = 0;
      
      iresult1 = bres1[0];
      iresult2 = br.ReadInt16();
      iresult3 = (bres3[0] | (bres3[1] << 8)) | (bres3[2] << 0x10);
      iresult4 = br.ReadInt32();
    }
  }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)