Wie bekomme ich die Bits eines "double" als "long"

8

Ich möchte die bitweise Darstellung von Fließkommazahlen in C # manipulieren. BinaryWriter und BinaryReader machen es so:

%Vor%

Gibt es eine Möglichkeit, dies ohne unsicheren Code zu tun und ohne den Aufwand, BinaryWriter und BinaryReader tatsächlich zu verwenden?

    
Qwertie 17.12.2010, 23:19
quelle

3 Antworten

3

Versuchen Sie, unsicheren Code zu vermeiden, oder möchten Sie nur eine Alternative zu diesen spezifischen Methoden in BinaryReader und BinaryWriter ?

?

Sie könnten BitConverter.DoubleToInt64Bits und BitConverter.Int64BitsToDouble , die entwickelt wurden, um genau das zu tun, was Sie brauchen, obwohl ich denke, dass sie das gleiche unsichere verwenden Konvertierung hinter die Kulissen als BinaryReader / BinaryWriter Methoden.

    
LukeH 18.12.2010, 02:09
quelle
7

Eine andere Möglichkeit besteht darin, eine benutzerdefinierte Struktur mit explizitem Layout zu verwenden, die sowohl eine long als auch eine double bei Offset 0 definiert. Dies entspricht einer union in C.

In etwa so:

%Vor%

Dann benutze das:

%Vor%

Dies wird unsicheren Code vermeiden und sollte auch ziemlich schnell sein, wenn Sie die Konvertierung auf dem Stack durchführen.

Ich habe das nicht versucht / zusammengestellt, aber ich denke, es sollte funktionieren:)

BEARBEITEN

Ich habe es gerade versucht und es funktioniert. Der Wert von longBytes oben ist 4608236261112822104.

Einige andere Werte:

%Vor%

Hier ist eine Methode, die das tut, was Sie wollen:

%Vor%     
Drew Noakes 17.12.2010 23:28
quelle
6

Sie können byte[] BitConverter.GetBytes(double) und long BitConverter.ToInt64(byte[],int) verwenden (indem Sie 0 als Start-Index übergeben), aber intern IIRC diese verwenden unsicheren Code und haben zusätzlich den Overhead eines Arrays. Wähle dein Gift ...

    
Marc Gravell 17.12.2010 23:21
quelle