Konvertieren byte [], um sbyte[]
Ich habe versucht, zu konvertieren, ein Array von byte[]
zu sbyte[]
.
Hier ist mein Beispiel-Array:
byte[] unsigned = { 0x00, 0xFF, 0x1F, 0x8F, 0x80 };
Ich schon so probiert:
sbyte[] signed = (sbyte[])((Array)unsigned);
Aber es funktioniert nicht. Es gibt keinen Wert im array nach dieser operation.
Hat jemand eine bessere Idee?
- Dieser code funktioniert in dem Sinne, dass es kompiliert und wirft keinen Fehler. Es Ergebnisse in ein array, das verwendet werden kann, wie
sbyte[]
in fast jeder situation, aber es ist immer noch gekennzeichnet alsbyte[]
von der Laufzeit. Nicht sicher, was du meinst mit "es ist kein Wert in dem array", für mich ist das array ist{0, -1, 31, -113, -128}
als erwartet. - Nach dem kompilieren gibt es keinen Wert in der signierten array. Visual Studio zeigt "?" in jedem element der signierten array.
- Ok, ich versuche, zu bekommen ein element aus der unterzeichnete array und es funktioniert immer noch. Vielen Dank für Ihre Hilfe. Ich versuche es mal mit dieser Lösung.
- Dann ist das ein VS-Beschränkung. VS kann nicht verstehen, dass ein array mit statischer Typ
sbyte[]
aber eine dynamische gebenbyte[]
gültig ist. Die CLR erlaubt es diese Form, aber in C# nicht. Dies ist ein hack, so in den meisten Anwendungen werden Sie verwenden möchten @Selman ' s Vorschlag. - Es ist nur der debugger hat Probleme mit dem anzeigen, da es wirklich ein
sbyte[]
Verweis auf einebyte[]
. - So etwas wie
(sbyte[])(object)ubytes
als Sie versucht haben, funktioniert einwandfrei, sieht einfach komisch in den debugger. - Keine Notwendigkeit zu löschen, die die ganze Antwort. Der zweite Teil ist richtig, obwohl ich lieber
sbyte[] signed = Array.ConvertAll(unsigned, x => unchecked((sbyte)x));
also es funktioniert auch, wenn überprüft Arithmetik aktiviert ist. - Warum beantworten Sie die Frage unter Verwendung Kommentare?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies funktioniert, da byte und sbyte haben die gleiche Länge im Speicher und können konvertiert werden, ohne die Notwendigkeit zu ändern, die aus dem Hauptspeicher.
Dieser Methode könnte jedoch dazu führen, dass einige seltsame Fehler mit dem debugger. Wenn Ihre byte-array ist nicht sehr groß, können Sie
Array.ConvertAll
statt.unchecked((sbyte)b)
also es funktioniert auch, wenn überprüft Arithmetik aktiviert ist. Es dient auch als Dokumentation, die überläufe sind gewollt und nicht nur eine performance-Optimierung.sbyte
sicherlich wirft mit Karo-Arithmetik. Was vielleicht verwirrt, ist, dass(byte)255 + (byte)255
nicht werfen, da die Operanden Holen gefördertint
wo es nicht überlaufen.Wie über die Verwendung
Buffer.BlockCopy
? Die gute Sache über dieser Antwort ist, dass vermeidet cast überprüfung auf eine byte-by-byte-basis. Das schlimme an dieser Antwort ist, dass vermeidet cast überprüfung auf eine byte-by-byte-basis.Diese nur kopiert das Byte, Werte über
byte.MaxValue
wird eine negativesbyte
Wert.Nimmt zwei Zeilen code, sollte aber schnell sein.
@
.signed
/unsigned
sind keine Schlüsselwörter in C#.Leicht tun Sie dies:
Ich bin mir nicht sicher über die syntax. überprüfen Sie, überprüfen Sie es.
ConvertAll
ist schneller und ebenso lesbar 2) ich bevorzugeunchecked((sbyte)b)
. Siehe @Sepehr Antwort für details.alt .net framework und alt .net core nicht unterstützen, reinterpret_cast ,aber Unterstützung * Zeiger und unsicherer code.
neue .net version system hinzufügen.Speicher-Bibliothek, können Lösungen dieser Frage, und kopieren Sie memory.