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

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

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

C++ Быстрый вывод float [100][100] в виде картинки
Написать функцию, которая получает значение типа float и возвращает две строки: одна представляет вещественное число в обычном виде ,а другая C++
invalid types `float[float]' for array subscript C++
C++ Вывести число в его шестнадцатиричном виде
cannot convert `float' to `float*. Почему так происходит? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Desu_Is_A_Lie
 Аватар для Desu_Is_A_Lie
62 / 62 / 3
Регистрация: 26.02.2012
Сообщений: 114
20.06.2013, 18:35     Считывание float из файла в шестнадцатиричном виде #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
Для продолжения нажмите любую клавишу . . .
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
20.06.2013, 19:39     Считывание float из файла в шестнадцатиричном виде #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
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.06.2013, 20:39     Считывание float из файла в шестнадцатиричном виде #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
Desu_Is_A_Lie
 Аватар для Desu_Is_A_Lie
62 / 62 / 3
Регистрация: 26.02.2012
Сообщений: 114
20.06.2013, 21:18     Считывание float из файла в шестнадцатиричном виде #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];
Grendizer
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 6
21.06.2013, 07:26  [ТС]     Считывание float из файла в шестнадцатиричном виде #6
Всем спасибо. Буду проверять и разбираться.
Yandex
Объявления
21.06.2013, 07:26     Считывание float из файла в шестнадцатиричном виде
Ответ Создать тему
Опции темы

Текущее время: 02:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru