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

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

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

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

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

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 831
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
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
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];
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2013, 07:26     Считывание float из файла в шестнадцатиричном виде
Еще ссылки по теме:

Алгоритм определения количества цифр в шестнадцатиричном числе - C++
Привет, у меня постала задача создать программу на с++, связану с определениям количества цифр в шестизначному числе. Определения должно...

Считать данные из текстового файла и записать их в массив float-ов - C++
Помогите пожалуйста!!!Очень нужно! как считать данные из txt файла и записать их в массив float на языке с++.

неверное приведение void* к *float а далее к float - C++
Почему когда привожу void* к int* потом к int то все работает, данные не бьются и работают нормально, когда делаю те же операции но с...

cannot convert `float' to `float*. Почему так происходит? - C++
всем привет, помогите исправить ошибки... а то голова мало варит уже, а завтра надо сдать уже #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt;...

Считывание файла - C++
Как можно считать из файла строку 110011, как массив чисел, заранее спасибо!

Считывание с файла - C++
Суть задачи такова дан файл test.txt нужно вывести на экран число таких групп букв, которые начинаются и кончаются одной и тойже...


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

Или воспользуйтесь поиском по форуму:
Grendizer
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 6
21.06.2013, 07:26  [ТС]     Считывание float из файла в шестнадцатиричном виде #6
Всем спасибо. Буду проверять и разбираться.
Yandex
Объявления
21.06.2013, 07:26     Считывание float из файла в шестнадцатиричном виде
Ответ Создать тему
Опции темы

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