Feedback

C# - Bits zwischen Double und Long (Int64) 'konvertieren'

Veröffentlicht von am 22.08.2013
(0 Bewertungen)
Es gibt zwar von Microsoft die BitConverter.DoubleToInt64Bits-Methode, diese ist aber noch nicht in allen Frameworks verfügbar.
http://msdn.microsoft.com/DE-DE/library/vstudio/system.bitconverter.doubletoint64bits.aspx

Da diese Methode ursprünglich über Zeiger arbeitet, und der Compiler /unsafe dafür benötigt, kann man das in einer portablen Klassenbibliothek nicht so einfach nachmachen.

Ein Möglicher Workaround besteht darin, eine Struktur zu erstellen, welche je einen Long und einen Double Wert an Position 0 anlegt und darum beim Abrufen die selben Bits verwendet werden.

Zusätzlich habe ich hier je eine Erweiterungsmethoden für Long und Double implementiert.
[StructLayout(LayoutKind.Explicit)]
private struct BitUnion//Zum konvertieren der Bytes zwischen Long und Double
{
	//Beide beim Offset 0, somit gibts beim abrufen auch immer die selben Bits/Bytes
	[FieldOffset(0)]
	public double Double;
	[FieldOffset(0)]
	public long Long;
}

/// <summary>
/// Ruft die Bits eines Double-Wertes als Int64 ab.
/// </summary>
/// <param name="d">Ein Double-Wert.</param>
/// <returns>Die Bits von <paramref name="d"/>.</returns>
public static long ToInt64(this double d)
{
	return new BitUnion { Double = d }.Long;
}
/// <summary>
/// Erstellt einen neuen Doublewert und kopiert die Bits von <paramref name="d"/> in die neue Instanz.
/// </summary>
/// <param name="d">Die zu verwendenden Bits.</param>
/// <returns>Ein Double mit den Bits von <paramref name="d"/>.</returns>
public static double ToDouble(this long d)
{
	return new BitUnion { Long = d }.Double;
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!