The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"чтение/конвертирование бинарных данных из файла"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"чтение/конвертирование бинарных данных из файла"  
Сообщение от елка on 10-Июн-07, 21:00 
char doublebuf[2] = {0};

ifstream rStream( pathfile.c_str(), ios::in | ios::binary );
rStream.seekg(0);
rStream.get( doublebuf, 2 );

далее нужно перевести считанные два байта в int, как это сделать?

(может есть у кого пример считывания двоичных данных и конвертация их в int?)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "чтение/конвертирование бинарных данных из файла"  
Сообщение от jd (??) on 10-Июн-07, 21:41 
Что вы понимаете под конвертацией в int? Если имеется в виду, что вы читаете из файла двухбайтовое целое значение, то почему бы его не считать сразу в переменную типа int?

int val = 0;
rStream.read(&val, 2); // хотя вообще-то работоспособность этого кода зависит от платформы

и зачем вы делаете seekg(0) сразу после открытия файла??

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "чтение/конвертирование бинарных данных из файла"  
Сообщение от елка on 10-Июн-07, 21:46 
>Что вы понимаете под конвертацией в int? Если имеется в виду, что
>вы читаете из файла двухбайтовое целое значение, то почему бы его
>не считать сразу в переменную типа int?
>
>int val = 0;
>rStream.read(&val, 2); // хотя вообще-то работоспособность этого кода зависит от платформы
>
>и зачем вы делаете seekg(0) сразу после открытия файла??


платформа linux, read считывает в char
и считывание в int вываливает в ошибку ((

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "чтение/конвертирование бинарных данных из файла"  
Сообщение от jd (??) on 10-Июн-07, 22:10 
>платформа linux, read считывает в char
>и считывание в int вываливает в ошибку ((

Под платформой я имел в виду скорее процессор. Будем считать, что это IA32 (то есть какой-нибудь обычный интеловский процессор или типа того).

Чтобы не ругалось, нужно сделать:
rStream.read((char*)&val, 2);

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "чтение/конвертирование бинарных данных из файла"  
Сообщение от елка on 10-Июн-07, 22:26 
спасибо, получается
теперь осталось изменить порядок следования байтов на обратный
т.к. считывая с файла 01 EB
получаю 60161
вместо 491

т.е. после считывания к int конвертирует EB 01 (в файле 01 EB)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "чтение/конвертирование бинарных данных из файла"  
Сообщение от jd (??) on 10-Июн-07, 23:35 
>теперь осталось изменить порядок следования байтов на обратный
>т.к. считывая с файла 01 EB
>получаю 60161
>вместо 491
>
>т.е. после считывания к int конвертирует EB 01 (в файле 01 EB)

Поэтому я и говорил с самого начала про платформу и про "Что вы понимаете под конвертацией в int?".

Порядок следования байт - штука относительная. На интеловской архитектуре всё именно так, как вы говорите, то есть по меньшему адресу находится младший байт, по большему - старший. Таким образом результат, полученный вами, предсказуем и корректен с точки зрения интел. Другое дело, что вам, вероятно нужен другой результат (ведь задачу ставит не производитель процессоров), поэтому нужно точнее описывать, что вы хотите получить. Короче, если не забивать голову, можете просто сделать так:

unsigned char doublebuf[2] = {0}; // обратите внимание на то, что doublebuf теперь unsigned char[]

ifstream rStream( pathfile.c_str(), ios::in | ios::binary );
rStream.read( (char*)doublebuf, 2 )
int n = ((int)doublebuf[0] << 8) | buf[1];


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

int n = 0;
rStream.read((char*)&n, 2);
n = ((n & 0xff) << 8) | (n >> 8); // меняем два младших байта местами (старшие байты равны нулю)


А вообще настоятельно рекомендую почитать академическую литературу. Всё это - основы и без понимания их - никуда.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "чтение/конвертирование бинарных данных из файла"  
Сообщение от jd (??) on 10-Июн-07, 23:55 
Можно ещё сделать так:

int n = 0;
rStream.read(((char*)&n) + 1, 1);
rStream.read((char*)&n, 1);


Или так:

#include <stdint.h>
...
char doublebuf[2]={0};
rStream.read(doublebuf + 1, 1);
rStream.read(doublebuf, 1);
int n = (int)*(uint16_t*)doublebuf;

Или ещё каким-нибудь из миллиона (извращенских) способов... :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "чтение/конвертирование бинарных данных из файла"  
Сообщение от елка on 11-Июн-07, 23:26 
спасибо!

ещё вариант int n = (doublebuf + 0x100 & 0xff ) << 8 | (doublebuf1 + 0x100 & 0xff);

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "чтение/конвертирование бинарных данных из файла"  
Сообщение от jd (??) on 12-Июн-07, 16:55 
без коментариев...
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру