Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Grendizer
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 6
#1

Считывание float из файла в шестнадцатиричном виде - C++

20.06.2013, 17:48. Просмотров 616. Ответов 5
Метки нет (Все метки)

Здравствуйте.
Возникла такая проблема:
есть файл с числами float в шестнадцатиричном виде. К примеру 41 A5 54 6D (это что-то около 23.2637484 (примерно)). Как мне его считать и преобразовать к нормальному виду, учитывая, что при обычном считывании каждый символ воспринимается как байт, а в данном случае один байт это два символа.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2013, 17:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Считывание float из файла в шестнадцатиричном виде (C++):

Вывести число в его шестнадцатиричном виде - C++
Есть переменная: int c = 50; Знаю, что можно реализовать при помощи сишной функции: printf("%x", c); Но как это сделать средствами...

Вывести старший и младший байт заданного целого положительного числа в шестнадцатиричном и двоичном виде - C++
Дано целое положительное число , тип int. Вывести старший и младший байт в 16ом и в 2ом виде.

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing - C++
#include<stdio.h> #include<stdlib.h> #include<math.h> float f1(float x)/*vira*enie 1*/ {return (x*cos(x))/(1+ pow(x,2));} ...

Заменить считывание с клавиатуры на считывание из файла - C++
Помогите пожалуйста, ни разу не работал со считыванием из файла поэтому не понимаю как и что делать. Почитал в интернете, попробовал, не...

Как сложить два float-а, имея их представление в виде массива байт? - C++
Здравствуйте. Нужна помощь. Я храню float числа в виде массива 4-х байтов. Подскажите как не переводя массив обратно во float,...

Быстрый вывод float [100][100] в виде картинки - C++
Значит имеется массив float , или если хотите COLORREF . Нужно побыстрее вывести его на экран в виде truecolor - bitmap. Комманда SetPixelV...

5
Desu_Is_A_Lie
62 / 62 / 3
Регистрация: 26.02.2012
Сообщений: 114
20.06.2013, 18:35 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*************************************************************************************/
#include    <tchar.h>
#include    <iostream>
#include    <cstdint>
/*************************************************************************************/
 
union FLT_HEX
{
    float           fNum;
    std::uint8_t    btNum[4];
};
/*************************************************************************************/
 
int _tmain(int argc, _TCHAR* argv[])
{   
    FLT_HEX     ufTest;
        
    std::cout   << "Floating point number: ";
    std::cin    >> ufTest.fNum;
    std::cout   << "HEX view: " << std::hex << (int)ufTest.btNum[0] << " " << (int)ufTest.btNum[1] << " " << (int)ufTest.btNum[2] << " " << (int)ufTest.btNum[3] << "\n";
    
    std::cout   << "Floating point number (HEX): ";
    std::cin    >> std::hex >> (int&)ufTest.btNum[0] >> (int&)ufTest.btNum[1] >> (int&)ufTest.btNum[2] >> (int&)ufTest.btNum[3];
    std::cout   << "Normal view: " << ufTest.fNum << "\n";  
 
    std::system("pause");
    return      0;
}
/*************************************************************************************/
Кликните здесь для просмотра всего текста
Floating point number: 1234
HEX view: 0 40 9a 44
Floating point number (HEX): 0 40 9a 44
Normal view: 1234
Для продолжения нажмите любую клавишу . . .
1
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
20.06.2013, 19:39 #3
Скиньте тестовый файл чтобы проверить.

Добавлено через 1 минуту
Desu_Is_A_Lie, просили же для чисел с плавающей запятой, а std::hex с таким не справляется. Это было бы через чур просто

Добавлено через 3 минуты
В общем, проверяйте...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
 
using namespace std;
 
int main()
{
    ifstream file("input.txt");
    ofstream out("output.txt");
    if (!file.good() || !out.good()) return -1;
    string hex_value;
 
    const float _2pow23 = static_cast<float>( 1 << 23 );
 
    while ( getline(file, hex_value) ) {
        if (hex_value[0] == 'r') continue;
        remove_if( hex_value.begin(), hex_value.end(), ::isspace );
        hex_value.insert(0, "0x");
        unsigned int bits = stod(hex_value);
        int S = bits >> 31;
        int E = (bits << 1) >> 24;
        int M = (bits << 9) >> 9;
        float x = (S ? -1.0 : 1.0 ) *
            powf(2.0, E - 127.0) * //E - 127.0 может быть отрицательным
            (1.0 + M / _2pow23 );
        out << fixed << x << endl;
    }
    file.close();
    out.close();
    return 0;
}
Кликните здесь для просмотра всего текста
3E4CCCCD
431BA000
41 A5 54 6D


Кликните здесь для просмотра всего текста
0.200000
155.625000
20.666224


Добавлено через 44 секунды
Забыл сказать, что это для чисел одинарной точности, то есть порядка не более 10^38
1
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
20.06.2013, 20:39 #4
Цитата Сообщение от Grendizer Посмотреть сообщение
К примеру 41 A5 54 6D (это что-то около 23.2637484 (примерно)).
Странно. У меня получилось 20.66622353
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <cstdint>
#include <iomanip>
 
int main() {
    
    int value[4];
    uint8_t byte[4];
    float f;
    
    for( int i=0; i<4; ++i )
    {
        std::cin >> std::hex >> value[i];
        byte[3-i] = value[i];
    }
    
    std::cout << std::setprecision(10) << *reinterpret_cast<float*>(byte) << std::endl;
    
    return 0;
}
http://ideone.com/J0ZyCt
1
Desu_Is_A_Lie
62 / 62 / 3
Регистрация: 26.02.2012
Сообщений: 114
20.06.2013, 21:18 #5
Цитата Сообщение от Olivеr Посмотреть сообщение
просили же для чисел с плавающей запятой, а std::hex с таким не справляется
Цитата Сообщение от Grendizer Посмотреть сообщение
файл с числами float в шестнадцатиричном виде. К примеру 41 A5 54 6D
Каким образом std::hex и чтение 4х байт не справляется?
В привидённом мною коде достаточно поменять
C++
1
std::cin    >> std::hex >> (int&)ufTest.btNum[0] >> (int&)ufTest.btNum[1] >> (int&)ufTest.btNum[2] >> (int&)ufTest.btNum[3];
на
C++
1
std::cin    >> std::hex >> (int&)ufTest.btNum[3] >> (int&)ufTest.btNum[2] >> (int&)ufTest.btNum[1] >> (int&)ufTest.btNum[0];
и оно будет спокойно считывать файл ТСа.

Если нет разделения на байты, то ещё проще:
C++
1
std::cin    >> std::hex >> (std::uint32_t&)ufTest.btNum[0];
0
Grendizer
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 6
21.06.2013, 07:26  [ТС] #6
Всем спасибо. Буду проверять и разбираться.
0
21.06.2013, 07:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2013, 07:26
Привет! Вот еще темы с ответами:

Считывание файла в массив и запись нового файла - C++
Консоль VS C++. Текстовый файл открывается как бинарный, и считывается по 100 байт в массив - и сразу они переписываются в другой файл. В...

Написать функцию, которая получает значение типа float и возвращает две строки: одна представляет вещественное число в обычном виде ,а другая - C++
Написать функцию, которая получает значение типа float и возвращает две строки: одна представляет вещественное число в обычном виде ,а...

Чем отличаются float преобразования (float)var от float(var) - C++
Здравствуйте! Подскажите, чем отличается (float)var от float(var)

Чтение int и float из файла - C++
Ну вот опять - печатает в конце программы что-то невообразимое. В начале всё хорошо, а потом засбоила. Может каунтер поставить? Подскажите,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru