Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с внешним устройством, Работа с внешним устройством 
V
    Опции темы
Mapiha87
Дата 5.10.2010, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.10.2010

Репутация: нет
Всего: нет



Помогите пожалуйста.
Дали готовую программу по работе с железом на С++Builder6. Надо переделать для другого прибора.
Прибор выдает 8 байт 50 57 54 70 52 69 52 49 если перевести на символы  2 9 6 f 4 e 4 1 
Надо преобразовать в вид 0х29 0х6f 0х4е 0х41 что соответствует числу float 12.90
Функции типа atof не подходят.
Ничего не получается. Марина.
 smile 
PM MAIL   Вверх
mrbrooks
Дата 5.10.2010, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



memcpy
PM MAIL   Вверх
mes
Дата 5.10.2010, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



вот допиливайте :
Код

#include <iostream>

typedef unsigned char data_t[8];
data_t src = { 50, 57, 54, 70, 52, 69, 52, 49 };

unsigned char make_byte (unsigned char hi, unsigned char lo)
{
   return ( hi << 4 ) | lo;
}
unsigned char c2h (unsigned char c)
{
    if ( '0'<=c && c<='9' ) return c-'0';
    if ( 'a'<=c && c<='f' ) return c-'a' + 10;
    if ( 'A'<=c && c<='F' ) return c-'A' + 10; 
    return 0xff; // error
}


float get_float (data_t d)
{
 // 
  union helper  
  {
      float f;
      unsigned char b[4];  // check: sizeof (float) == 4 
  } h;
     
   for (int i=0, j=0; i<4; ++i, j+=2)
   { 
      h.b[i] = make_byte (c2h(d[j]) ,c2h(d[j+1]));
   }
   return   h.f;
}

int main () {

   std::cout << get_float (src);
}



Это сообщение отредактировал(а) mes - 5.10.2010, 09:30


--------------------
PM MAIL WWW   Вверх
mrbrooks
Дата 5.10.2010, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



ужасный своей красотой велосипед
PM MAIL   Вверх
Леопольд
Дата 5.10.2010, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(Mapiha87 @  5.10.2010,  07:50 Найти цитируемый пост)
Надо преобразовать в вид 0х29 0х6f 0х4е 0х41 что соответствует числу float 12.90
Тут прямая зависимость от целевой архитектуры, про которую не сказано ни слова...
Код
#include <cassert>
#include <iostream>
#include <sstream>

int main()
{
    char const* bytes = "296f4e41";
    std::stringstream hexStr;
    hexStr << "0x" << bytes;

    assert(sizeof(unsigned) == sizeof(float));
    union
    {
        unsigned u;
        float f;
    }data;
    hexStr >> std::hex >> data.u;

    std::cout<<data.f<<std::endl;
    std::cout<<hexStr.str()<<std::endl;

    return 0;
}

Linux, g++
Код
5.31365e-14
0x296f4e41
Если инвертировать порядок  байт (0x414e6f29) то будет ~12.9
http://codepad.org/tdv6UtL5


Это сообщение отредактировал(а) Леопольд - 5.10.2010, 10:41


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
bsa
Дата 5.10.2010, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Леопольд, у ТС четко указано Builder6. Это сразу определяет и платформу, и компилятор.

Это сообщение отредактировал(а) bsa - 5.10.2010, 10:31
PM   Вверх
Леопольд
Дата 5.10.2010, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(Mapiha87 @  5.10.2010,  07:50 Найти цитируемый пост)
Дали готовую программу по работе с железом на С++Builder6. Надо переделать для другого прибора.
bsa, я подумал что надо переделать под что-то иное... smile


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Mapiha87
  Дата 6.10.2010, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.10.2010

Репутация: нет
Всего: нет



Спасибо Леопольд. Разбираюсь smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0616 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.