Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
2 / 2 / 2
Регистрация: 05.11.2014
Сообщений: 62

Как получить из 4 char получить 1 float

13.01.2015, 16:29. Показов 4061. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Народ всем привет.

Подскажите, пожалуйста, как из 4 char получить 1 float?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.01.2015, 16:29
Ответы с готовыми решениями:

Как из объекта String получить char* (НЕ const char*)
Доброго времени! Стандартная процедура работы с SD-card принимает параметр типа char *. Однако, объект String имеет метод(c_str)который...

Как получить битики float
Здравствуйте! Кто-нибудь знает как получить битики у float? vector<bool>code; int i2 = 0; float one = 1; float x = 0.36...

Как получить значение float после solve
Вот что я считаю polinomials := {x^2+y^2-1, x = 0.5}; p := solve(polinomials); Получаю вот это: p := {x = 1.500000000, y =...

38
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
13.01.2015, 18:44
C++
1
2
char test[] = "2.11";
float chislo = atof(test);
0
2 / 2 / 2
Регистрация: 05.11.2014
Сообщений: 62
13.01.2015, 20:31  [ТС]
Спасибо. Но это ни то. Виноват. Надо было уточнить.

Принимается массив из 4 байт типа unsigned char, которые изначально были заложены в переменную float, которая обычно компилятором всегда представляется в виде 4 байт.
Теперь мне необходимо обратно склеить эти 4 байта и получить тот же float.
Вопрос только как?
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
13.01.2015, 21:11
C++
1
2
3
4
5
float f = 1.34f;
unsigned char buff[4];
memcpy(buff, &f, sizeof(float));
 
float num = *(float *)&buff;
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.01.2015, 21:22
demmax2004, как-то у тебя обратная задача решена
0
2 / 2 / 2
Регистрация: 05.11.2014
Сообщений: 62
13.01.2015, 21:22  [ТС]
Но memcpy копирует значения из f в buff. Соответственно буфер buff поменяет значения и переменная num получит совсем другое. Или я что-то недопонимаю?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.01.2015, 21:22
Цитата Сообщение от tolstiybh Посмотреть сообщение
Но memcpy копирует значения из f в buff
Нужно копировать наоборот: из buff в f, а потом просто распечатать f
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
13.01.2015, 21:24
Цитата Сообщение от Evg Посмотреть сообщение
как-то у тебя обратная задача решена
Цитата Сообщение от tolstiybh Посмотреть сообщение
Или я что-то недопонимаю?
C++
1
float num = *(float *)&buff;
Че не понятного то ???
0
2 / 2 / 2
Регистрация: 05.11.2014
Сообщений: 62
13.01.2015, 21:27  [ТС]
таким образом:
C++
1
2
3
4
5
float f = 1.34f;
unsigned char buff[4];
memcpy(&f, buff, sizeof(float));
 
float num = *(float *)&f;
Теперь правильно?

Добавлено через 1 минуту
demmax2004, memcpy копирует значения из 2-го аргумента в 1-й, а не наоборот! А если как ты описал изначально, то ты мне буфер затираешь!
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.01.2015, 21:35
Лучший ответ Сообщение было отмечено tolstiybh как решение

Решение

Ну хоть чуть-чуть можно же самому напрячь мозги. У тебя на вход подаётся массив из 4 char'ов, а потому в программе его как минимум нужно чем-то инициализировать.

C
#include <stdio.h>
#include <string.h>
 
int main (void)
{
  char buf[4] = { 0x1f, 0x85, 0x45, 0x41 }; /* <---- твой буфер */
  float f;
 
  memcpy (&f, buf, sizeof (f));
  printf ("f=%f\n", f);
 
  /* А можно и так */
  f = *((float*)buf);
  printf ("f=%f\n", f);
 
  return 0;
}
1
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
13.01.2015, 21:36
Цитата Сообщение от tolstiybh Посмотреть сообщение
Теперь правильно?
Просто

C++
1
memcpy(&f, buff, sizeof(float));
0
2 / 2 / 2
Регистрация: 05.11.2014
Сообщений: 62
13.01.2015, 21:42  [ТС]
Evg, Можно и так, но какdemmax2004, тоже можно, хоть и появляется еще одна ФЛОАТ.
Тот, что я поправил от demmax2004, - работает, спасибо!

Добавлено через 51 секунду
Evg, спасибо большое.
Вообще завтра по-настоящему попробую и отпишусь
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
13.01.2015, 21:45
Есть и другие способы

C++
1
2
3
4
5
6
7
8
9
10
union {
    float f;
    unsigned long ul;
 } num_f;
 
 unsigned char a, b, c, d;
 
num_f.ul = (a << 24) | (b << 16) | (c << 8) | d;
 
float f = num_f.f;

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 union {
    float f;
    unsigned long ul;
    unsigned char b[4];
 } num_f;
 
 unsigned char a, b, c, d;
 
 num_f.b[0] = a;
 num_f.b[1] = b;
 num_f.b[2] = c;
 num_f.b[3] = d;
 
 num_f.b[3] = a;
 num_f.b[2] = b;
 num_f.b[1] = c;
 num_f.b[0] = d;
 
float f = num_f.f;
1
2 / 2 / 2
Регистрация: 05.11.2014
Сообщений: 62
13.01.2015, 21:46  [ТС]
demmax2004, это верно, спасибо большое за многочисленные примеры
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.01.2015, 21:52
Цитата Сообщение от tolstiybh Посмотреть сообщение
Evg, Можно и так, но какdemmax2004, тоже можно, хоть и появляется еще одна ФЛОАТ
Дык я ничего нового не изобретал, я просто разжевал пример от demmax2004. А лишний float в его решении - похоже на досадную опечатку, которые люди склонны проявлять к вечеру рабочего дня
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
14.01.2015, 07:22
Цитата Сообщение от Evg Посмотреть сообщение
А лишний float в его решении - похоже на досадную опечатку
Вы про какой лишний флоат ?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.01.2015, 11:13
Про "float num = *(float *)&f;", т.к. он равен "f"
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
14.01.2015, 11:22
Цитата Сообщение от Evg Посмотреть сообщение
Про "float num = *(float *)&f;", т.к. он равен "f"
Это вообще не мой код !!!
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.01.2015, 11:54
Цитата Сообщение от demmax2004 Посмотреть сообщение
Это вообще не мой код
Действительно. Это я опечатался при чтении
0
2 / 2 / 2
Регистрация: 05.11.2014
Сообщений: 62
15.01.2015, 13:54  [ТС]
demmax2004, Это Ваш код:
C++
1
2
3
4
5
float f = 1.34f;
unsigned char buff[4];
memcpy(buff, &f, sizeof(float));
 
float num = *(float *)&buff;
Так что, num - лишний ФЛОАТ!

Лично у меня реализовано по примеру Evg с одним ФЛОАТОМ. Все работает.
Всем спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.01.2015, 13:54
Помогаю со студенческими работами здесь

Как из байта получить char?
a:byte; b:char; a:=$AD Нужно чтобы после преобразования b='AD' Как сделать?

Как из QString получить char* ?
QString q = &quot;12334&quot;; нужен указатель на объект с этими циферками типа char*

Как получить текущую дату в char*
Искал, везде старые методы, не работают.Нужно получить только текущую дату в char*. Буду благодарен за помощь.

Как получить массив int'ов из строчки char?
Собственно весь вопрос в теме. Как получить массив int'ов из строчки char? Вот мои попытки: int data_bin = atoi(data); //это...

Как получить const BYTE *?(из string или char)
Есть строчку, которую может ввести юзер(строчка = путь к файлу). Нужно получить из этого cons BYTE * Как это сделать?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru