2011-01-10 11 views
2

Wie würde ich eine Byte-Array, Byte [] von kleinen zu großen Endian konvertieren.Konvertieren Byte-Array von kleinen zu großen Endian oder umgekehrt

Ich überlege, dieses Programm auf Mono zu portieren und frage mich nach dem besten Ansatz. Jede Hilfe wäre willkommen.

EDIT: Ich lese aus einer Datei sowohl auf Witwen und Mono.

Danke. Bob.

+0

die Byte-Array enthält whatevers in fr lesen om eine Datei. –

Antwort

3

Sie können einen byte[] nicht in Big Endian konvertieren, wenn Sie nicht wissen, was in der byte[] ist. Zum Beispiel müssen 2-Byte-Ganzzahlen ihre zwei Bytes vertauscht haben, während 4-Byte-Ganzzahlen ihre 4 Bytes umgekehrt haben müssen. Wenn das Array nur eine ganze Zahl enthält, funktioniert das Umkehren der Elemente. Wenn nicht, müssen Sie jede einzelne im Array enthaltene Entität separat verarbeiten.

Mono.DataConvert ist eine Bibliothek, die hier helfen kann, wenn Sie wissen, welche Segmente des Arrays als welche Art von Datentyp behandelt werden müssen. Ich empfehle dringend, diese Bibliothek zu überprüfen; Ich benutze es in mehreren Projekten und es ist ziemlich raffiniert. Es ist sogar MIT lizenziert und ist in einer Quelldatei enthalten, so dass Sie es einfach direkt in jede Assembly kompilieren können, die Sie gerade erstellen.

+0

Hmm schön, danke für den Mono.DataConvert Tipp! –

+0

Hi cdhowie, ich habe den Mono.DataConvert gesehen, weiß aber nicht wie ich ihn anwenden soll. Im Wesentlichen enthält das Array das, was in einer Protokolldatei in Windows oder Mono auf einem anderen System gelesen wird. Ich möchte sicherstellen, dass alles, was gelesen wird, ein einzelnes Endian-Format (Windows-Standard) für alle Log-Reader ist, wo auch immer es sich befindet oder liest. –

+0

Ohne das Format dieser Protokolldatei zu kennen, gibt es nichts, was Sie tun können. – cdhowie

0

Möchten Sie die Elemente im Array oder den Wert der Bytes selbst umkehren? Wenn nur das Array, dann können Sie verwenden Array.Reverse()

2

Hmm, ich denke, es gibt ein Problem hier. Ein Byte-Array ist selten inhärent Big Endian oder Little Endian. Ein Byte ist fast immer endian-unabhängig. Was Sie wahrscheinlich wollen, ist die Endiane der Ganzzahlen, Zeichen etc. im Byte-Array zu korrigieren.

Um dies zu tun, müssen Sie zuerst die Bytes identifizieren, die die Ganzzahl bilden, char usw. und dann diese Bytes umdrehen. Einfach Spiegeln/möglicherweise nicht das gesamte Array umgekehrt (es sei denn, das gesamte Array eine einzelne ganze Zahl darstellt, char etc.)

Verwenden Sie die folgenden Überlastung des Array.Reverse() Methode zu tun, was Sie wollen ...

public static void Reverse(
    Array array, 
    int index, 
    int length 
) 
1

In meinem Fall musste ich von einem bestimmten Schlüssel (der schon im Little-Endian-Format war) in Big-Endian-String konvertieren. Es war einfacher als ich es mir vorgestellt hatte und erforderte keine Verschiebung von Bytes. Hier ist eine einfache Konsolenanwendung habe ich es zu testen:

using System; 
    using System.Text; 

    public class Program 
    { 
     public static void Main() 
     { 
      string key = "B13E745599654841172F741A662880D4"; 
      var guid = new Guid(key); 
      string hex = HexStringFromBytes(guid.ToByteArray()); 
      Console.WriteLine("Original key: " + guid); 
      Console.WriteLine();     
      Console.WriteLine("Big-endian version of the key: " + hex); 
      Console.ReadLine(); 
     } 

     public static string HexStringFromBytes(byte[] bytes) 
     { 
      var sb = new StringBuilder(); 
      foreach (byte b in bytes) 
      { 
       var hex = b.ToString("x2"); 
       sb.Append(hex); 
      } 
      return sb.ToString(); 
     } 
    } 

gegebenen Beispiel druckt diese in der Konsole:

Originalschlüssel: B13E7455-9965-4841-172F-741A662880D4

Big-Endian Version des Schlüssels: 55743eb165994148172f741a662880d4

Sie eine Arbeits Geige finden Sie hier: Little Endian to Big Endian