各种类型的按位端交换

biz*_*dee 7 .net c#

随着各种渠道的帮助下,我已经写了一些SwapBytes在我的二进制读取类的方法,在交换端ushort,uint以及ulong所有使用所有原始C#,无需任何按位运算unsafe的代码.

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;
}
Run Code Online (Sandbox Code Playgroud)

我将如何创建相同的方法,但是对于每种类型的签名版本,例如short,int和long,只使用与上面相同的方法,以及可以对上述方法进行哪些改进?

har*_*old 16

而不是从概念上解构为单独的字节,然后以相反的方式重新组装它们,您可以在概念上交换字节组,如下所示:(未经测试)

public uint SwapBytes(uint x)
{
    // swap adjacent 16-bit blocks
    x = (x >> 16) | (x << 16);
    // swap adjacent 8-bit blocks
    return ((x & 0xFF00FF00) >> 8) | ((x & 0x00FF00FF) << 8);
}
Run Code Online (Sandbox Code Playgroud)

对32位没有多大帮助(或根本没有帮助),但对于64位它没有帮助(未经测试)

public ulong SwapBytes(ulong x)
{
    // swap adjacent 32-bit blocks
    x = (x >> 32) | (x << 32);
    // swap adjacent 16-bit blocks
    x = ((x & 0xFFFF0000FFFF0000) >> 16) | ((x & 0x0000FFFF0000FFFF) << 16);
    // swap adjacent 8-bit blocks
    return ((x & 0xFF00FF00FF00FF00) >> 8) | ((x & 0x00FF00FF00FF00FF) << 8);
}
Run Code Online (Sandbox Code Playgroud)

对于签名类型,只需转换为无符号,执行此操作,然后转换回来.


Kek*_*Kek 9

你应该看看以下msdn页面:http://msdn.microsoft.com/en-us/library/system.bitconverter.aspx

您可以简单地使用Array.Reverse和bitConverter:

  int value = 12345678;
  byte[] bytes = BitConverter.GetBytes(value);

  Array.Reverse(bytes); 
  int result = BitConverter.ToInt32(bytes, 0);
Run Code Online (Sandbox Code Playgroud)

  • 精细.我真的不想对它进行基准测试.我相信你.它只是一种简短(易于维护)的编写方式,以防性能不成问题. (4认同)
  • `BitConverter`使用本机字节序,速度很慢,而且`Array.Reverse`会阻塞不必要的实例,使其更慢. (2认同)

gre*_*man 5

为了完整起见——现在已经有了BinaryPrimitives.ReverseEndianness