2009-10-21 5 views
5

Je lis d'un flux binaire qui est big-endian. La classe BitConverter le fait automatiquement. Malheureusement, la conversion en virgule flottante dont j'ai besoin n'est pas la même que BitConverter.ToSingle (byte []), donc j'ai ma propre routine d'un collègue. Mais l'octet d'entrée [] doit être en little-endian. Est-ce que quelqu'un a un moyen rapide de convertir l'endianness d'un tableau byte []. Bien sûr, je pourrais échanger chaque octet, mais il doit y avoir un truc. Merci.Un moyen rapide d'échanger des octets dans un tableau de gros boutiste à petit boutiste en C#

Répondre

0

À quoi ressemble la routine de votre collègue? S'il accède explicitement aux octets, vous pouvez changer le code (ou plutôt, créer une méthode séparée pour les données big-endian) au lieu d'inverser les octets.

+0

J'ai besoin de convertir le tableau au préalable dans l'objet message. – initialZero

+0

Jon, MiscUtil n'a-t-il pas EndianBitConverter? – LBushkin

+1

@LBushkin: C'est le cas, et c'était ma première pensée - mais il semble que ce soit un problème différent. –

3

Voici une méthode rapide pour changer endianess pour les célibataires dans un tableau d'octets:

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

Dites que mon entrée dans hex est 62,4d, 00,4e puis la sortie que je pensais être 49,62,4e, 00, mais cela pourrait être parce que je travaille en mots de 16 bits. SwapSingles renvoie 4e, 00,4d, 62 ce qui n'est pas ce dont j'ai besoin. – initialZero

+0

@initialZero: Un seul est quatre octets. Donc, est-ce que vous n'avez pas d'octets ou qu'ils ne représentent pas un célibataire? – Guffa

4

J'utilise LINQ:

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

Vous pouvez également .Skip() et .Take() au contenu de votre cœur, ou bien utiliser un index dans les méthodes BitConverter.

+0

Notez, 'Array.Reverse()' est une ancienne façon de le faire. – Pat

+0

Rapide à implémenter? Peut être. Rapide à l'exécution? Probablement pas. – ulrichb

+0

@Pat Array.Reverse modifie le tableau d'origine, tandis que .Reverse(). ToArray() crée un nouveau tableau. Énorme différence. Rien sur une ancienne ou une nouvelle façon de le faire. – juFo