Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Преобразование hex в Double в си / 23 сообщений из 23, страница 1 из 1
19.10.2015, 06:39
    #39079615
t111к
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
Добрый день.
Не подскажите как преобразовать байты в дробное число в си?
Есть байты 0000000000805A40 - это дробное число 106.0. Как в языке си получить это число?
...
Рейтинг: 0 / 0
19.10.2015, 09:49
    #39079756
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
Это оно?

https://ru.wikipedia.org/wiki/Число_двойной_%D
1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8
...
Рейтинг: 0 / 0
19.10.2015, 10:21
    #39079792
m_Sla
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
Код: plaintext
1.
2.
3.
4.
    char b[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x5A, 0x40 };
    double *d = (double *) b;

    cout << *d << endl;
...
Рейтинг: 0 / 0
19.10.2015, 11:17
    #39079844
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
m_Sla
Код: plaintext
1.
2.
3.
4.
    char b[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x5A, 0x40 };
    double *d = (double *) b;

    cout << *d << endl;

Вот я намаялся такой код со Spark на x86 портировать....
...
Рейтинг: 0 / 0
19.10.2015, 11:21
    #39079848
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
t111кДобрый день.
Не подскажите как преобразовать байты в дробное число в си?
Есть байты 0000000000805A40 - это дробное число 106.0. Как в языке си получить это число?
Думаю что самый надёжный вариант - преобразовывать в целое или строку десятичных цифр
и делать кастинг в double.

Вариант m_Sla возможно будет работать но нужно смотреть на лимиты по рязрядной сетке
чтобы не затронуть те биты которые отвечают за знак и экспоненту.

https://ru.wikipedia.org/wiki/Число_двойной_точности
...
Рейтинг: 0 / 0
19.10.2015, 11:22
    #39079849
t111к
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
Да нет не в с++, а чисто в си мне нужно
char test[] = "0000000000805A40";
double temp = strtod(test,NULL);
-это тоже не подходит.
...
Рейтинг: 0 / 0
19.10.2015, 11:24
    #39079853
t111к
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
А можно если кто знает на данном конкретном примере преобразовать?
...
Рейтинг: 0 / 0
19.10.2015, 11:26
    #39079856
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
Обоснуй почему не подходит. Нам жаль своё время и не хочется тратить его на викторину или угадайку.
...
Рейтинг: 0 / 0
19.10.2015, 11:29
    #39079860
t111к
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
Ну 106 таким образом не получается.
Если смотреть под отладчиком
Name : temp
Details:805
Default:805
Decimal:805
Hex:0x325
Binary:1100100101
Octal:01445
Если переводить из шестнадцатиричного в деситичное число получиться - 8411712
...
Рейтинг: 0 / 0
19.10.2015, 11:34
    #39079866
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
t111кДа нет не в с++, а чисто в си мне нужно
замени cout на printf() будет чисто си

Для начала уточни как исходные данные представлены. Так
t111к
Код: plaintext
1.
char test[] = "0000000000805A40";

или так
m_Sla
Код: plaintext
1.
    char b[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x5A, 0x40 };
...
Рейтинг: 0 / 0
19.10.2015, 11:41
    #39079877
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
Dima T, я-бы уточнил как он вообще получил данные что 0000000000805A40 равно 106.0
...
Рейтинг: 0 / 0
19.10.2015, 11:43
    #39079884
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
t111кДобрый день.
Не подскажите как преобразовать байты в дробное число в си?
Есть байты 0000000000805A40 - это дробное число 106.0. Как в языке си получить это число?

Для этого нужно знать, в каком формате это число записано. В каком виде.

Потому что шестнадцатиричное число -- это на самом деле не число, а представление в виде шестнадцатиричных
цифр байт буфера, где лежит это число, поэтому нужно знать формат этого буфера.

Если это просто целое число, то надо просто прочитать буфер памяти как число соотв. разрядности и знаковости,
и преобразовать в double (или float).
...
Рейтинг: 0 / 0
19.10.2015, 11:50
    #39079892
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
t111кНу 106 таким образом не получается. А оно в принципе может получится? Какой формат этих байтов? На IEEE 754 не похоже. В нем целые числа как целые выглядят, даже без первой 1 в двоичной кодировке 106 не получается.

Из того что в голову пришло:

106dec = 1101010bin = 6Ahex = D4hex / 2 = 1A8hex / 4 = 350hex / 8

106dec = 101010bin (нормализованное); 101010bin = 2Ahex = 54hex / 2 = A8hex / 4 = 150hex / 8

Ничего такого в исходных данных не видно.
...
Рейтинг: 0 / 0
19.10.2015, 11:53
    #39079898
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
И это не BCD-арифметика.
...
Рейтинг: 0 / 0
19.10.2015, 11:58
    #39079912
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
mcureenabНа IEEE 754 не похоже.Вполне похоже, только порядок байтов обратный.
http://www.binaryconvert.com/result_double.html?decimal=049048054
...
Рейтинг: 0 / 0
19.10.2015, 12:10
    #39079939
t111к
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
Формат данных вот такой :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Heig	char [8]	0x7ffff6b97cc0	
	Heig[0]	char	0 '\000'	
	Heig[1]	char	0 '\000'	
	Heig[2]	char	0 '\000'	
	Heig[3]	char	0 '\000'	
	Heig[4]	char	0 '\000'	
	Heig[5]	char	-128 '\200'	
	Heig[6]	char	90 'Z'	
	Heig[7]	char	64 '@'	


Name : Heig
	Details:"\\000\\000\\000\\000\\000\\200Z@"
	Default:0x7ffff6b97cc0
	Decimal:140737332739264
	Hex:0x7ffff6b97cc0
	Binary:11111111111111111110110101110010111110011000000
	Octal:03777776656276300

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
int c1;

for (j2 = sizeof(Heig)-1; j2 >=0 ; j2--)
         	         		{
         	         		c1= Heig[j2];
         	         		if (c1<0)
         	         		c1=c1+256;
         	         		d1=Power(256,j11-1);
         	         		iheight=iheight+c1*d1;
         	         		j11++;
         	         		}



Чтобы посмотреть отображение числа 106 в байтах, нашли такой сайт:
http://www.binaryconvert.com/result_double.html?decimal=049048054
...
Рейтинг: 0 / 0
19.10.2015, 12:19
    #39079951
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
Так написали уже 18295611
Код: plaintext
1.
2.
double *d = (double *) Heig;
printf("%f\n", *d);
...
Рейтинг: 0 / 0
19.10.2015, 12:20
    #39079952
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
Тогда байты перевернуть и сделать кастинг.
...
Рейтинг: 0 / 0
19.10.2015, 12:26
    #39079955
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
t111кФормат данных вот такой :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Heig	char [8]	0x7ffff6b97cc0	
	Heig[0]	char	0 '\000'	
	Heig[1]	char	0 '\000'	
	Heig[2]	char	0 '\000'	
	Heig[3]	char	0 '\000'	
	Heig[4]	char	0 '\000'	
	Heig[5]	char	-128 '\200'	
	Heig[6]	char	90 'Z'	
	Heig[7]	char	64 '@'	


Name : Heig
	Details:"\\000\\000\\000\\000\\000\\200Z@"
	Default:0x7ffff6b97cc0
	Decimal:140737332739264
	Hex:0x7ffff6b97cc0
	Binary:11111111111111111110110101110010111110011000000
	Octal:03777776656276300

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
int c1;

for (j2 = sizeof(Heig)-1; j2 >=0 ; j2--)
         	         		{
         	         		c1= Heig[j2];
         	         		if (c1<0)
         	         		c1=c1+256;
         	         		d1=Power(256,j11-1);
         	         		iheight=iheight+c1*d1;
         	         		j11++;
         	         		}



Чтобы посмотреть отображение числа 106 в байтах, нашли такой сайт:
http://www.binaryconvert.com/result_double.html?decimal=049048054

Всё-таки это BCD, только по основанию 256...
...
Рейтинг: 0 / 0
19.10.2015, 12:42
    #39079970
t111к
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
Вроде
double *d = (double *) Heig; выходит 106, а как преобразовать
double *d в char, чтобы потом соединить её посредством strcat с другой строкой?
...
Рейтинг: 0 / 0
19.10.2015, 12:48
    #39079978
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
MasterZivВсё-таки это BCD, только по основанию 256...
Обычное число двойной точности только в little endian записи.
...
Рейтинг: 0 / 0
19.10.2015, 13:00
    #39079988
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
t111кВроде
double *d = (double *) Heig; выходит 106, а как преобразовать
double *d в char, чтобы потом соединить её посредством strcat с другой строкой?
Код: plaintext
1.
2.
3.
	char buf[256];
	sprintf(buf, "%f", *p);
	printf(buf);


так подойдет?
...
Рейтинг: 0 / 0
19.10.2015, 13:07
    #39079998
t111к
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование hex в Double в си
Да большое спасибо. Подходит.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Преобразование hex в Double в си / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]