Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Работа с внешним устройством


Автор: Mapiha87 5.10.2010, 07:50
Помогите пожалуйста.
Дали готовую программу по работе с железом на С++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 

Автор: mrbrooks 5.10.2010, 08:16
memcpy

Автор: mes 5.10.2010, 09:28
вот допиливайте :
Код

#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);
}


Автор: mrbrooks 5.10.2010, 09:54
ужасный своей красотой велосипед

Автор: Леопольд 5.10.2010, 10:22
Цитата(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

Автор: bsa 5.10.2010, 10:31
Леопольд, у ТС четко указано Builder6. Это сразу определяет и платформу, и компилятор.

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

Автор: Mapiha87 6.10.2010, 09:31
Спасибо Леопольд. Разбираюсь smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)