Au niveau du bit endian swap de différents types

Avec l'aide de diverses sources, j'ai écrit quelques SwapBytes méthodes dans mon binaire classe de lecteur que swap-boutiste dans ushort, uint, et ulong, tout en utilisant des opérations bit à bit tout en raw, C#, sans avoir besoin de unsafe code.

public ushort SwapBytes(ushort x)
{
    return (ushort)((ushort)((x & 0xff) << 8) | ((x >> 8) & 0xff));
}

public uint SwapBytes(uint x)
{
    return ((x & 0x000000ff) << 24) +
           ((x & 0x0000ff00) << 8) +
           ((x & 0x00ff0000) >> 8) +
           ((x & 0xff000000) >> 24);
}

public ulong SwapBytes(ulong value)
{
    ulong uvalue = value;
    ulong swapped =
         ((0x00000000000000FF) & (uvalue >> 56)
         | (0x000000000000FF00) & (uvalue >> 40)
         | (0x0000000000FF0000) & (uvalue >> 24)
         | (0x00000000FF000000) & (uvalue >> 8)
         | (0x000000FF00000000) & (uvalue << 8)
         | (0x0000FF0000000000) & (uvalue << 24)
         | (0x00FF000000000000) & (uvalue << 40)
         | (0xFF00000000000000) & (uvalue << 56));
    return swapped;
}

Comment pourrais-je aller sur la création de la même méthode, mais pour les versions signées de chacun de ces types, tels que le short, int et long, en Utilisant les mêmes méthodes que ci-dessus, et quelles améliorations pourraient être apportées aux méthodes ci-dessus?

  • Pourquoi avez-vous besoin de swap en premier lieu? Ne pourrait-on pas lire directement à l'aide souhaitée endianness à partir du tableau d'octets d'entrée? Dans mon expérience qui conduit à la plus rapide, la plus facile à lire et plus facile à un code de test.
InformationsquelleAutor bizzehdee | 2013-10-24