ntohl usw...



  • Tja, angenommen, man irrt sich 😃

    greetz, Swordfish



  • Ich will wirklich nicht eure "Religiösen-Debatten" stören xDDD
    Aber könntet ihr mir vielleicht mal gaaaaaaaaaaaannz kurz helfen ?
    Ihr hattet vor einnniiiger Zeit (eben iwann) geschrieben ich solle float etc einfach in bekannte daten typen converten... also wenn ich z.b. ein float in 2 chars speicher... die übertrage (tcp etc) und dann wieder in ein float konvertiere.. is das dann in ordnung ? wegen der byte-order... oder is das nur bei ganzzahlen wichtig ?!

    Gruß Chris



  • Du störst doch nicht 😃

    Wahrscheinlich soetwas in der Art:

    float value = 1.234f;
    
    if( sizeof( value ) <= sizeof( short ) ) {
    
        unsigned short *p = reinterpret_cast< unsigned short* >( &value );
        s_value = htons( *p );
    
    } else if( sizeof( value ) <= sizeof( long ) ) {
    
        unsigned long *p = reinterpret_cast< unsigned long* >( &value );
        l_value = htonl( *p );
    
    } else {
    
        // Houston, we've got a problem...
    }
    

    greetz, Swordfish



  • ahh ok aber es ist doch nötig wie ich vermutet habe, dass man float auch so handhaben sollte oder ? ich hab neulich in die sfml mal reingeschaut ...
    die Klasse Package dort handhabt nur short und int bzw long so ... d.h. mit floats bzw. double wird nichts gemacht.. aber im prinzip sollte man das doch so machen wie du geschrieben hast oder?

    Gruß Chris


  • Mod

    Swordfish schrieb:

    Du störst doch nicht 😃

    Wahrscheinlich soetwas in der Art:

    float value = 1.234f;
    
    if( sizeof( value ) <= sizeof( short ) ) {
    
        unsigned short *p = reinterpret_cast< unsigned short* >( &value );
        s_value = htons( *p );
    	
    } else if( sizeof( value ) <= sizeof( long ) ) {
    
        unsigned long *p = reinterpret_cast< unsigned long* >( &value );
        l_value = htonl( *p );
    
    } else {
    
        // Houston, we've got a problem...
    }
    

    greetz, Swordfish

    Das ist allerdings ziemlich undefiniert. Dann doch lieber:

    float value = 1.234f;
    char data[sizeof value];
    if ( htonl( 1000 ) == 1000 )
        copy(&reinterpret_cast<const char&>(value),&reinterpret_cast<const char&>(value)+sizeof value,data);
    else
        reverse_copy(&reinterpret_cast<const char&>(value),&reinterpret_cast<const char&>(value)+sizeof value,data);
    

    Das Ergebnis als irgendetwas anderes als einen Haufen von Bytes anzusehen erscheint mir zweifelhaft.



  • Scheint nicht so einfach zu sein: ➡ Re: host to network byte order for floats, and float32_t?

    greetz, Swordfish



  • wie schon gesagt:

    ich selbst schrieb:

    Foxx90 schrieb:

    ok also ntohl etc sind für die bytedarstellung wichtig... aber wie ist das denn jetzt bei floats.. doubles? werden die auf jeder plattform gleich dargestellt ?
    oder muss ich erst float in int umwandeln und dann die ints mit ntohl etc.. bearbeiten?

    das würde wohl auch nicht portabel sein. konvertiere float/double lieber in ein format, dass du selbst bestimmst (und wenn es nur ASCII ist) - ansonsten musst du wohl nachforschen, ob dein compiler dir IEEE-float unterstützung anbietet.



  • Fazit:

    Mann kann nur shorts, longs mit völliger Sicherheit übermitteln... float und double muss man zusammen frimmeln...

    Gruß Chris



  • Tja, und wenn man ein bisschen googelt, dann findet man heraus, dass es auch Standards für's "Zusammenfriemeln" gibt: ➡ RFC 1014 XDR: External Data Representation Standard

    greetz, Swordfish



  • Könnte man nich auch einfach den wert des floats bzw.. des doubles in einem string speichern und die chars übertragen ? und dann wieder zurück nach float oder geht das auch nicht ?



  • Ich könnte mir vorstellen, dass das funktionieren würde. Wäre ein Versuch Wert.



  • camper schrieb:

    zudem sind nur 3 verschiedene Arten für die Darstellung negativer Zahlen zugelassen:
    - Zweierkomplement
    - Einerkomplement
    - Vorzeichen+Betrag

    das stimmt meiner meinung nach auch. aber dann verstehe ich denn sinn von folgendem satz nicht:
    "that is, each signed integer type has the same object representation
    as its corresponding unsigned integer type."

    (bei swordfish rauskopiert: http://c-plusplus.net/forum/viewtopic-var-p-is-1459625.html#1459625)


Anmelden zum Antworten