Hexadezimal nach float konvertieren (IEEE format)



  • @Joomoo & Viper190: Ist mir schon klar. Ich würde einen reinterpret_cast< > jedoch desswegen nicht mit gefährlich attributieren. Man sollte bloß wissen, was man macht.

    Greetz, Swordfish



  • Vielleicht war gefährlich von mir ein wenig falsch gewählt.
    Sorry wollte deswegen jetzt keine Diskussion anfangen.

    Ja man muss halt wissen was man mach 😉

    cheers



  • Vielen dank! Ich teste es gleich 😉



  • Viper190 schrieb:

    Für dein ganzes Problem habe ich dir folgenden Code geschrieben.
    ich arbeite hier allerdings mit einem std::string (std::basic_string).
    Du musst halt deinen CString noch zu einem std::string bringen.
    (Sorry habe hier keine CString zu verfügung)

    #include <iostream>
    #include <string>
    #include <sstream>
    #include <iomanip>
    
    template <class T>
    bool from_string(T& t, 
                     const std::string& s, 
                     std::ios_base& (*f)(std::ios_base&))
    {
      std::istringstream iss(s);
      return !(iss >> f >> t).fail();
    }
    
    int main(int argc, char* argv[])
    {
    	
    	int intValue;
    	from_string<int>(intValue, std::string("3F0E5604"), std::hex);
    	float *val = reinterpret_cast< float* >( &intValue );
    	std::cout << std::setprecision(10) << *val << std::endl;
    	return 0;
    }
    

    Gruß
    Viper 190

    Joa super!!
    So geht es... ABER ^^

    Wie zum Geier wandle ich mein CString zu einem std::string.
    Bekomme ich nicht gebacken 🙄

    -------------- EDIT --------------
    Sorry habe versucht ne falsch Variable zu übergeben ^^

    so geht es

    /* Hex in float wndeln */
    	CString sNutzDaten = "3F0E5604";
    
        from_string<int>(intValue, LPCTSTR(sNutzDaten), std::hex);
        float *val = reinterpret_cast< float* >( &intValue );
        std::cout << std::setprecision(10) << *val << std::endl;
    
    	/* Ausgabe in einer EditBox */
    	sNutzDaten.Format("%.3f",*val);
    	GetDlgItem(IDC_LAST_RECIVED_STRING)->SetWindowText(sNutzDaten);
    


  • Bei mir funktioniert

    #include <string>
    #include <iostream>
    
    #include <atlstr.h>
    
    using namespace std;
    
    int main( )
    {
        CString cs = "Hello";
        string str;
    
        str = cs;
    
        cout << str << endl;
    }
    

    tadellos. Somit müsste der Aufruf von

    headfinger schrieb:

    from_string< int >( intValue, LPCTSTR( sNutzDaten ), std::hex );
    

    auch ohne dem Cast von sNutzDaten zu LPCTSTR funktionieren.

    Greetz, Swordfish



  • Irgendwie ist die Frage doch etwas sinnlos. Wenn man 'nen float im Rechner abspeichert, dann ist er doch im IEEE Format. Was gibts da noch zu konvertieren? Die sauberste Methode um sowas dann als anderen Typ zu lesen oder gar zu schreiben ist IMHO eine union. Da sorgt der Compiler dafür, das man keinen Speicher benutzt der einem nicht gehört. f'`8k

    Gruß, TGGC (\-/ returns)



  • @TGGGC:

    meinst du so:

    #include <iostream>
    
    using namespace std;
    
    union IEEE_float_converter_t {
    
        float f;
        unsigned int i;
    };
    
    int main( )
    {
        IEEE_float_converter_t ieeefc;
        ieeefc.i = 0x3F0E5604;
    
        cout << hex << ieeefc.i << " entspricht ";
    
        cout.precision( 10 );
        cout << ieeefc.f << endl;
    }
    

    oder?

    Greetz, Swordfish



  • und wie wärs damit? man müsste sich natürlich noch ein bisschen gedanken um die byte-reihenfolge machen - muss man aber mit int auch.

    union IEEE_float_converter_t 
    {	
        float f;
        unsigned char c[sizeof(float)];
    };
    


  • Wie genau, das hängt davon ab, was man erreichen will. So genau definiert das die Frage überhaupt nicht. f'`8k

    Gruß, TGGC (\-/ returns)



  • Ach TGGC, sei nicht immer so kleinlich. Wenn du es nur ungefähr so gemeint hast, wie hast du es dann exakt gemeint?

    Greetz, Swordfish


Anmelden zum Antworten