by Anonymous » 18 Aug 2025, 11:49
Ich arbeite in C# und versuche, vier Bytes in einen Float einzupacken (der Kontext ist die Spielentwicklung, bei der eine RGBA -Farbe in einen einzigen Wert gepackt ist). Dazu verwende ich BitConverter , aber bestimmte Konvertierungen scheinen zu falschen Bytes zu führen. Nehmen Sie das folgende Beispiel (unter Verwendung von Bytes 0, 0, 129, 255 ):
Code: Select all
var before = new [] { (byte)0, (byte)0, (byte)129, (byte)255 };
var f = BitConverter.ToSingle(before, 0); // Results in NaN
var after = BitConverter.GetBytes(f); // Results in bytes 0, 0, 193, 255
Verwenden Sie
https://www.h-schmidt.net/floatconverter/ieeee754.html, ich habe überprüft, ob die vier Bytes, mit denen ich begonnen habe (mit (
, entspricht Binary 000000000000001000000001111111111 ) den Gleitpunktwert 4.66338115943E-41 . Durch das Umdrehen der Endianges (binäre 111111111000010000000000000000 ) nan (der im obigen Code mit F übereinstimmt). Aber wenn ich diesen Float in Bytes umwandelte, bekomme ich 0, 0, 193, 255 (Anmerkung 193 Wenn ich 129 erwarte. Ergibt 0, 0, 128, 255 erneut). Angesichts dieser Tatsache vermute ich, dass Nan relevant ist. Diese Frage wird versucht, Bytes in einen Wert umzuwandeln (in diesem Fall zwei Bytes bis zu einem kurzen) und die falsche Endianess einen unerwarteten Wert. In meinem Fall ist der tatsächliche Float -Wert irrelevant (da ich nicht den konvertierten Wert als Float verwende). Stattdessen versuche ich, vier Bytes als Float direkt effektiv neu zu interpretieren, indem ich zuerst in einen Float konvertiere und dann zurück konvertiere. Wie gezeigt, gibt dieser Hin- und Her-Rückgang manchmal verschiedene Bytes zurück als die, die ich gesendet habe. Wie Peter Duniho kommentiert, wird BitConverter niemals die von Ihnen übergebenen Bytes ändern, sondern einfach an einen neuen Speicherort kopieren und das Ergebnis neu interpretieren. Wie mein Beispiel zeigt, ist es jedoch möglich, vier Bytes zu senden (
), die intern kopiert und neu interpretiert werden, um einen Float zu interpretieren, und dann umwandeln, dass Float in Bytes zurückkehrt, die unterschiedlich sind als die Originale (Originale (
).
Die Endiangness wird häufig in Bezug auf BitConverter erwähnt. In diesem Fall bin ich jedoch der Meinung, dass Endiangess nicht das Wurzelproblem ist. Wenn ich BitConverter.Tosingle nenne, übergasse ich ein Array von vier Bytes. Diese Bytes repräsentieren einige binäre (32 Bit), die in einen Schwimmer umgewandelt werden. Durch Ändern der Endianges vor dem Funktionsaufruf , das ich nur tue, ändere die Bits, die ich in die Funktion sende. Unabhängig von dem -Wertzwert dieser Bits sollte es möglich sein, sie in einen Float (ebenfalls 32 Bit) umzuwandeln, und dann den Float zurück konvertieren, um die gleichen Bits zu erhalten, die ich in gesendet habe. Wie in meinem Beispiel gezeigt, führt die Verwendung von Bytes 0, 0, 129, 255 (binär 0000000000000000100000000111111111 ) zu einem Gleitpunktwert. Ich möchte diesen Wert nehmen (der von diesen Bits dargestellte Schwimmer) und ihn in die ursprünglichen vier Bytes
konvertieren.
Ist dies in C# in allen Fällen möglich?
Ich arbeite in C# und versuche, vier Bytes in einen Float einzupacken (der Kontext ist die Spielentwicklung, bei der eine RGBA -Farbe in einen einzigen Wert gepackt ist). Dazu verwende ich BitConverter , aber bestimmte Konvertierungen scheinen zu falschen Bytes zu führen. Nehmen Sie das folgende Beispiel (unter Verwendung von Bytes 0, 0, 129, 255 ):
[code]var before = new [] { (byte)0, (byte)0, (byte)129, (byte)255 };
var f = BitConverter.ToSingle(before, 0); // Results in NaN
var after = BitConverter.GetBytes(f); // Results in bytes 0, 0, 193, 255
[/code]
Verwenden Sie https://www.h-schmidt.net/floatconverter/ieeee754.html, ich habe überprüft, ob die vier Bytes, mit denen ich begonnen habe (mit ([code]0, 0, 129, 255[/code], entspricht Binary 000000000000001000000001111111111 ) den Gleitpunktwert 4.66338115943E-41 . Durch das Umdrehen der Endianges (binäre 111111111000010000000000000000 ) nan (der im obigen Code mit F übereinstimmt). Aber wenn ich diesen Float in Bytes umwandelte, bekomme ich 0, 0, 193, 255 (Anmerkung 193 Wenn ich 129 erwarte. Ergibt 0, 0, 128, 255 erneut). Angesichts dieser Tatsache vermute ich, dass Nan relevant ist. Diese Frage wird versucht, Bytes in einen Wert umzuwandeln (in diesem Fall zwei Bytes bis zu einem kurzen) und die falsche Endianess einen unerwarteten Wert. In meinem Fall ist der tatsächliche Float -Wert irrelevant (da ich nicht den konvertierten Wert als Float verwende). Stattdessen versuche ich, vier Bytes als Float direkt effektiv neu zu interpretieren, indem ich zuerst in einen Float konvertiere und dann zurück konvertiere. Wie gezeigt, gibt dieser Hin- und Her-Rückgang manchmal verschiedene Bytes zurück als die, die ich gesendet habe. Wie Peter Duniho kommentiert, wird BitConverter niemals die von Ihnen übergebenen Bytes ändern, sondern einfach an einen neuen Speicherort kopieren und das Ergebnis neu interpretieren. Wie mein Beispiel zeigt, ist es jedoch möglich, vier Bytes zu senden ([code]0, 0, 129, 255[/code]), die intern kopiert und neu interpretiert werden, um einen Float zu interpretieren, und dann umwandeln, dass Float in Bytes zurückkehrt, die unterschiedlich sind als die Originale (Originale ([code]0, 0, 193, 255[/code]).
Die Endiangness wird häufig in Bezug auf BitConverter erwähnt. In diesem Fall bin ich jedoch der Meinung, dass Endiangess nicht das Wurzelproblem ist. Wenn ich BitConverter.Tosingle nenne, übergasse ich ein Array von vier Bytes. Diese Bytes repräsentieren einige binäre (32 Bit), die in einen Schwimmer umgewandelt werden. Durch Ändern der Endianges vor dem Funktionsaufruf , das ich nur tue, ändere die Bits, die ich in die Funktion sende. Unabhängig von dem -Wertzwert dieser Bits sollte es möglich sein, sie in einen Float (ebenfalls 32 Bit) umzuwandeln, und dann den Float zurück konvertieren, um die gleichen Bits zu erhalten, die ich in gesendet habe. Wie in meinem Beispiel gezeigt, führt die Verwendung von Bytes 0, 0, 129, 255 (binär 0000000000000000100000000111111111 ) zu einem Gleitpunktwert. Ich möchte diesen Wert nehmen (der von diesen Bits dargestellte Schwimmer) und ihn in die ursprünglichen vier Bytes [url=viewtopic.php?t=12659]konvertieren.[/url]
Ist dies in C# in allen Fällen möglich?