Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение байтов 
:(
    Опции темы
timur85
Дата 23.6.2007, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 19.6.2007

Репутация: нет
Всего: нет



Здравствуйте 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;
        }

Существует ли более элегантное решение?
 
PM MAIL   Вверх
Zeit
Дата 23.6.2007, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 5.5.2007

Репутация: нет
Всего: нет



Есть еще два класса чтения и записи бинарных файлов, BinaryReader и BinaryWriter, соответственно в классе BinareWriter есть методы для чтения различных типов данных, в т.ч. и для int. ReadInt32, так вроде называется.
PM MAIL   Вверх
timur85
Дата 23.6.2007, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 19.6.2007

Репутация: нет
Всего: нет



Да я знаком с этими классами, но они не считывают нужное мне кол-во байт.
В файле поле занимает 4 байта, а мне надо получить значение только из первых 2 байт этого поля.
В этом вся загвоздка... smile 
PM MAIL   Вверх
Zeit
Дата 23.6.2007, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 5.5.2007

Репутация: нет
Всего: нет



Ммм, а чем плох сдвиг влево\вправо? Или xor, or?)

Это сообщение отредактировал(а) Zeit - 24.6.2007, 00:01
PM MAIL   Вверх
timur85
Дата 24.6.2007, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 19.6.2007

Репутация: нет
Всего: нет



А каким образом это реализовано в C#?
PM MAIL   Вверх
stab
Дата 24.6.2007, 04:58 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



пользуйся BinaryReader и будет тебе счатье.

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

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

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

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


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
tol05
Дата 24.6.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Код

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();
    }
  }



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0451 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.