随着各种渠道的帮助下,我已经写了一些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)
对于签名类型,只需转换为无符号,执行此操作,然后转换回来.
你应该看看以下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)
| 归档时间: |
|
| 查看次数: |
16273 次 |
| 最近记录: |