double von c nach Java



  • Hallo
    gibt es irgendwo eine funktion, die ein C double so konvertiert, das man es in Java laden kann? Also ein C programm soll ein konvertiertes double in eine Datei speichern und ein Java Programm soll es ohne probleme laden koennen.

    Von mir aus aus irgendeiner API oder Bibliothek.
    Ich hab z.B. diese Funktionen benutzt um den double in Network-Endian zu konvertieren, bei long oder int geht das gut, bei double scheitert es:

    inline unsigned int htonl (unsigned int i) {
      return
        ( i << 24 ) & 0xFF000000 |
       ( i << 8  ) & 0x00FF0000 |
       ( i >> 8  ) & 0x0000FF00 |
       ( i >> 24 ) & 0x000000FF;
    }
    
    inline unsigned long long htonll (unsigned long long ll) {
      return
        ( ll << 56 ) & 0xFF00000000000000ULL |
       ( ll << 40 ) & 0x00FF000000000000ULL |
       ( ll << 24 ) & 0x0000FF0000000000ULL |
       ( ll << 8  ) & 0x000000FF00000000ULL |
        ( ll >> 8  ) & 0x00000000FF000000ULL |
       ( ll >> 24 ) & 0x0000000000FF0000ULL |
       ( ll >> 40 ) & 0x000000000000FF00ULL |
       ( ll >> 56 ) & 0x00000000000000FFULL;
    }
    
    double htond(double d) 
    {
        unsigned long long ll = htonll( *(unsigned long long *)&d ) ;
        return *(double *)&ll ;
    }
    

    Ich glaub bei Double C/Java ist es mehr als nur der Endian?



  • DEvent schrieb:

    gibt es irgendwo eine funktion, die ein C double so konvertiert, das man es in Java laden kann? Also ein C programm soll ein konvertiertes double in eine Datei speichern und ein Java Programm soll es ohne probleme laden koennen.

    probier das:

    double d = 1.234;
    unsigned char *p = (unsigned char*)&d;
    FILE *fp = fopen (...);
    fputc (p[7], fp);
    fputc (p[6], fp);
    fputc (p[5], fp);
    fputc (p[4], fp);
    fputc (p[3], fp);
    fputc (p[2], fp);
    fputc (p[1], fp);
    fputc (p[0], fp);
    fclose (fp);
    

    also umgekehrt in die datei schreiben. vielleicht klappts?
    🙂



  • Soweit ich weiss benutzt die Java Virtual Machine Big Endian. Prinzipiell sollte es dann tatsächlich reichen die Bytes in umgekehrter Reihenfolge in die Datei zu schreiben.

    Wäre es aber nicht einfacher in C zu sagen fprintf(datei,"%f",3.12) und dann das Java-Programm die Zahl einfach als String einlesen lassen und mit

    double zahl = Double.valueOf(mystring).doubleValue();
    

    umzuwandeln? Sollte eigentlich diese ganze lowlevel-byteorder-Geschichte unnötig machen, sofern ich den Threadersteller richtig verstanden habe.



  • Herr jth schrieb:

    umzuwandeln? Sollte eigentlich diese ganze lowlevel-byteorder-Geschichte unnötig machen, sofern ich den Threadersteller richtig verstanden habe.

    Habe ich mir auch schon ueberlegt. Problem ist nur das es ca. 2*10.000 double Werte sind.

    Ach ist mir auch egal, dann wird die Datei eben etwas groesser.



  • Java hat afaik ein eigenes nicht (oder zumindest nicht vollständig) zum IEEE754 kompatibles Fließkommazahlenformat.



  • bin ich den der einzige der jemals auf die Idee gekommen ist ein Programm in C zu schreiben, das double-Werte berechnet, es in eine binaere Datei abspeichert und dann versucht diese Daten in einem Java Programm zu visuallisieren?

    Haette nicht gedacht das ich so ein "Querdenker" bin.

    Ich speichere die jetzt einfach als eine Textdatei ab und ferdig ist.



  • DEvent schrieb:

    bin ich den der einzige der jemals auf die Idee gekommen ist ein Programm in C zu schreiben, das double-Werte berechnet, es in eine binaere Datei abspeichert und dann versucht diese Daten in einem Java Programm zu visuallisieren?

    Binaer zu speichern ist immer furchtbar wenn es um interop geht.


Anmelden zum Antworten