2009-10-21 5 views
5

Ich lese aus einem binären Stream, der Big-Endian ist. Die BitConverter-Klasse erledigt dies automatisch. Leider ist die Fließkommaumwandlung, die ich brauche, nicht dieselbe wie BitConverter.ToSingle (byte []), so dass ich meine eigene Routine von einem Mitarbeiter habe. Aber das Eingabebyte [] muss in Little-Endian sein. Hat jemand eine schnelle Möglichkeit, die Endianität eines byte [] Arrays zu konvertieren. Klar, ich könnte jedes Byte tauschen, aber es muss einen Trick geben. Vielen Dank.Schnelle Möglichkeit, Bytes in Array von Big Endian zu Little Endian in C auszutauschen #

Antwort

0

Wie sieht die Routine von Ihrem Mitarbeiter aus? Wenn es explizit auf die Bytes zugreift, können Sie den Code ändern (oder stattdessen eine separate Methode für Big-Endian-Daten erstellen), anstatt die Bytes umzukehren.

+0

Ich muss das Array zuvor im Nachrichtenobjekt konvertieren. – initialZero

+0

Jon, hat MiscUtil keinen EndianBitConverter? – LBushkin

+1

@LBushkin: Es tut, und das war mein erster Gedanke - aber es klingt wie dies ein anderes Problem ist. –

3

Hier ist eine schnelle Methode zur Endianess für Single in einem Byte-Array zu ändern:

public static unsafe void SwapSingles(byte[] data) { 
    int cnt = data.Length/4; 
    fixed (byte* d = data) { 
    byte* p = d; 
    while (cnt-- > 0) { 
     byte a = *p; 
     p++; 
     byte b = *p; 
     *p = *(p + 1); 
     p++; 
     *p = b; 
     p++; 
     *(p - 3) = *p; 
     *p = a; 
     p++; 
    } 
    } 
} 
+0

Sage meine Eingabe in hex ist 62,4d, 00,4e, dann sollte der Ausgang 49,62,4e, 00 sein, aber das könnte sein, weil ich in 16bit Worten arbeite. SwapSingles gibt 4e, 00,4d, 62 zurück, was ich nicht brauche. – initialZero

+0

@initialZero: Ein Single ist vier Bytes. Also, haben Sie keine Bytes oder repräsentieren sie keine Single? – Guffa

4

Ich benutze LINQ:

var bytes = new byte[] {0, 0, 0, 1}; 
var littleEndianBytes = bytes.Reverse().ToArray(); 
Single x = BitConverter.ToSingle(littleEndianBytes, 0); 

Sie können auch .Skip() und .Take() zum Inhalt Ihres Herzens, oder Verwenden Sie einen Index in den BitConverter-Methoden.

+0

Hinweis, 'Array.Reverse()' ist ein alter Weg, es zu tun. – Pat

+0

Schnell zu implementieren? Könnte sein. Schnell zur Laufzeit? Wahrscheinlich nicht. – ulrichb

+0

@Pat Array.Reverse ändert das ursprüngliche Array, während .Reverse(). ToArray() ein neues Array erstellt. Großer Unterschied. Nichts über eine alte oder neue Art, es zu tun. – juFo