double to byte array?? wieso so umständlich?



  • Hey mans,

    ich will ein double in ein byte array mappen.. wieso geht das so umständilich mit c# ?? 😞

    double test=34243.445;
    
    MemoryStream tee = new MemoryStream();
    BinaryWriter teew = new BinaryWriter(tee);
    teew.Write((double)test);
    
    byte[] b= tee.ToArray();
    

    in c/c++ würde das ja so easy gehen

    double test=34243.445;
    unsigned char* p= (unsigned char*)&test;
    

    geht sdas nich eleganter, schneller , perfomanter?





  • BorisDieKlinge schrieb:

    ich will ein double in ein byte array mappen.. wieso geht das so umständilich mit c# ?? 😞

    double test=34243.445;
    
    MemoryStream tee = new MemoryStream();
    BinaryWriter teew = new BinaryWriter(tee);
    teew.Write((double)test);
    
    byte[] b= tee.ToArray();
    

    Weil hier immer dasselbe rauskommt.

    in c/c++ würde das ja so easy gehen

    double test=34243.445;
    unsigned char* p= (unsigned char*)&test;
    

    geht sdas nich eleganter, schneller , perfomanter?

    Weil hier auf jeder Plattform etwas anderes rauskommt. Mach es in C++ so, dass das Ergebnis global identisch ist, und Du wirst viel mehr Code haben 😃



  • ja das mit der Plattform stimmt schon.. und die

    BitConverter.GetBytes( argument );
    

    Variante ist die auch so platformunabhängig?

    sowas geht nich oder?

    object a= (double)1.5;
    object b= (int) 5;
    object c= (string) "Hello";
    
    BitConverter.GetBytes(a);
    BitConverter.GetBytes(b);
    BitConverter.GetBytes(c);
    

    also object in bytearray (byte[]) wandeln?



  • Wenn du unbedingt die Typsicherheit untergraben willst, dann vielleicht notfalls mit dem unsafe-Krams?

    Und dir ist klar, dass im Fall von

    object a = 1.5;
    

    der Wert geboxt wird? Es ist also nicht soetwas, wie ein void-Zeiger solltest du das denken.

    unsafe {
       var value = 1.5;
       var asBytePointer = (byte*)&value;
    }
    

    Arrays oder Teile einer Klasse musst du erst festpinnen, damit es nicht vom GC während deiner Arbeit wild im Speicher rumgeschoben wird und deine Zeiger somit plötzlich ungültig würden:

    unsafe
    {
       var array = new double[50];
    
       fixed (double* address = array)
       {
          // hier benutzen
       }
    }
    

Anmelden zum Antworten