Wie kann ich umwandeln byte-array UInt32 array?
Können sagen, In C++ ich habe code wie dieser..
void * target
uint32 * decPacket = (uint32 *)target;
So, in C# wäre es wie..
byte[] target;
UInt32[] decPacket = (UInt32[])target;
Nicht konvertieren Typ byte[] uint[]
Wie konvertiere ich diese Speicher ausrichten, was C++ tut zu arrays in C#?
Ich werde hinzufügen, dass es ist ein schmutziger trick: stackoverflow.com/questions/619041/...
Gibt es eine bessere (und schmutziger) trick, das vermeidet Wiederholungen. Siehe unten meine Antwort: stackoverflow.com/a/9666331/61061
Gibt es eine bessere (und schmutziger) trick, das vermeidet Wiederholungen. Siehe unten meine Antwort: stackoverflow.com/a/9666331/61061
InformationsquelleAutor SSpoke | 2011-09-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, etwas in der Nähe wäre, die Nutzung
Buffer.BlockCopy
:Beachten Sie, dass das Letzte argument zu
BlockCopy
ist immer die Anzahl der bytes zu kopieren, unabhängig von der Art Sie kopieren.Können Sie nicht nur zu behandeln, eine
byte
array alsuint
array in C# (zumindest nicht in den safe-code; ich weiß nicht, was in unsicheren code) - aberBuffer.BlockCopy
wird splat-die Inhalte derbyte
array in dieuint
array... verlassen die Ergebnisse werden ermittelt auf der Grundlage der endianness des Systems. Ich persönlich bin nicht ein fan von diesem Ansatz - es verlässt den code eher anfällig für Fehler, wenn Sie sich bewegen, um ein system mit einem anderen Speicher-layout. Ich bevorzuge eindeutig sein in meinem Protokoll. Hoffentlich es hilft dir in diesem Fall aber.In unsicheren code, Sie können sozusagen tun Sie es - Sie können es beheben, array und verwenden Sie Zeiger Mathematik zum Durchlaufen der byte-array als uint-Zeiger direkt. Es funktioniert gut, aber es ist im Grunde die Rückkehr zu einem C/C++/native-Ansatz...
InformationsquelleAutor Jon Skeet
Du kann haben den Kuchen (keine Zuweisungen) und ihn auch Essen (vermeiden Iterationen), wenn Sie bereit sind, zu bewegen, um die dunkle Seite.
Schauen Sie in meine Antwort zu einer ähnlichen Frage, bei denen ich zeigen, wie zu konvertieren float[] , byte[] und Umgekehrt: Was ist der Schnellste Weg, um konvertieren von float[] in ein byte[]?
InformationsquelleAutor Omer Mor
Als Jon erwähnt, Puffer.BlockCopy wird auch für das kopieren.
Allerdings, wenn dies ist eine interop-Szenario, und Sie möchten, um Zugriff auf das byte-array direkt als
uint[]
, das nähste, das Sie tun können, ist der C++ - Ansatz wäre die Verwendung von unsicherem code:Ich persönlich bevorzuge Anfertigung der Kopie, aber wenn Sie benötigen, um zu vermeiden, eigentlich kopieren der Daten, diese nicht ermöglichen es Ihnen zu arbeiten (in einem unsicheren Kontext).
CallInteropMethod
C#, in einem unsicheren Kontext, kann handeln sehr ähnlich wie C++ - und alle, die Zeiger Güte/Bösartigkeit zurück 😉
Die
CallInteropMethod
war nur zu sagen, "das ist etwas, was füllen Sie in das byte[]" - normalerweise wäre dies nicht in reinen managed code...Bla ich dachte darüber nach.. und ich war krank von C++.. deshalb bin ich die Portierung dieses zu .NET.. also behalte ich es strikt C#.. ohne unsafe-code. (Ehrlich gesagt, ich bin sehr verwirrt 😛 muss ich wickeln Sie alle Klammern, alle meine Logik? dann habe ich auch encPacket die auch Byte -> uint32 bla zu kompliziert hehe
Guten Ruf (es sei denn, dies ist perf. Kritischer code) - ich würde in der Regel zu vermeiden, dies in allen Situationen, außer bei denen, wo ich habe ein Profil erstellt und entdeckt, dass es sehr, sehr schwer zu handhaben, ansonsten ohne größere Auswirkungen.
InformationsquelleAutor Reed Copsey
Können Sie
Buffer.BlockCopy
. AnstattArray.Copy
,BlockCopy
muss ein byte-Ebene kopieren, ohne die überprüfung der array-Typen voll kompatibel.Etwa so:
Warum? Die Länge, um das argument zu
BlockCopy
wird in Byte angegeben.InformationsquelleAutor thecoop
Schleife über alle array-Elemente und rufen Sie Konvertieren.ToUint32() auf jedem von Ihnen.Hier:
Hier ist ein offizieller link von MSDN.
http://msdn.microsoft.com/en-us/library/469cwstk.aspx
UInt32
's sind es byte ist.. ich hab auch 2 bytes in 1uint
obwohl.Ich denke
new Uint32[target.length]
werdennew Uint32[target.length / sizeof(UInt32)]
Dies erfordert die Verwendung von BitConverter wenn Sie Loopen möchten. Dadurch erhalten Sie eine Einheit mit dem Wert der einzelnen byte - das ist sehr Verschieden...
Fühlen Sie sich frei zu Bearbeiten, wenn Sie sicher sind, dass es stimmt @SSpoke.Ich bin immer offen für Menschen, die bereit sind, zu beheben meine Fehler.
InformationsquelleAutor