Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение из hex-файла функцией fread(), и перевод всего этого в десятичн. число! 
:(
    Опции темы
Frostya
  Дата 15.5.2009, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 9.5.2009
Где: Russia, Saint-Pet ersburg

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



Всем привет!

Вот есть bmp-файл. Предположим, я хочу прочесть из него какие-то расположенные по порядку 4 байта.
Считываю эти байты функцией fread(buf,4,1,bmpfile) и теперь они у меня в char-массиве buf.

Вопрос: как из этой последовательности 4х байт составить десятичное число????

Вот есть 4 байта: 0x96 0x00 0x00 0x00 (по-возрастанию слева-направо). Считываются они в массив buf, т.е. в данном случае у нас в buf[0] будет число 0x96.
Так вот, пытаюсь я перевести это число в десятичное но у меня почему-то в результате получается отрицательное число!

Код

int hex2int (char *buft, int k)
{
// k - кол-во считываемых байт из файла
double x=0;
int tmp1=0;
int tmp2=0;
for(i=0;i<k;i++)
    {
    tmp1=buft[i]/0x10;
    tmp2=buft[i]%0x10;

    x=x+tmp1*pow(16,i+1)+tmp2*pow(16,i);

    }
return x;
}

Например, прочёл байт 0x96 в buf[0] и после выполнения строк
tmp1=buft[0]/0x10;
tmp2=buft[i]%0x10;
в tmp1 оказывается число -6, а в tmp2 число -12

Это сообщение отредактировал(а) Frostya - 15.5.2009, 19:33
PM   Вверх
azesmcar
Дата 15.5.2009, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(Frostya @  15.5.2009,  18:42 Найти цитируемый пост)
Вот есть 4 байта: 0x96 0x00 0x00 0x00 (по-возрастанию слева-направо). Считываются они в массив buf, т.е. в данном случае у нас в buf[0] будет число 0x96.


об этом что ли речь?
Код

unsigned char p[4] = {0x96, 0x00, 0x00, 0x00};
unsigned int v = *((int*)p);

PM   Вверх
Frostya
Дата 15.5.2009, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 9.5.2009
Где: Russia, Saint-Pet ersburg

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



azesmcar,
Цитата
unsigned int v = *((int*)p);

а теперь обьясните пожалуйста эту строчку.  smile 
PM   Вверх
azesmcar
Дата 15.5.2009, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(Frostya @  15.5.2009,  19:05 Найти цитируемый пост)
а теперь обьясните пожалуйста эту строчку.  smile  

ну..сначала приводим к указателю на тип int
Код

int *pi = (int*)p;

потом разыменовываем
Код

int i = *pi;

в двух словах - указываем что по адресу на который указывает наш указатель на самом деле лежит целочисленный тип, и берем его значение.
это конечно не очень переносимо, переносимое решение - это учитывать размер переменной типа int (так как гарантии на его размер нет) и не забывать про little-endian, big-endian.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




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


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

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