EndianExtensions.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System;
  2. namespace MatrixIO.IO
  3. {
  4. public static class EndianExtensions
  5. {
  6. #region ByteSwap
  7. public static ushort ByteSwap(this ushort v)
  8. {
  9. return (ushort)(((v & 0xff) << 8) | ((v >> 8) & 0xff));
  10. }
  11. public static uint ByteSwap(this uint v)
  12. {
  13. return (uint)(((((ushort)v).ByteSwap() & 0xffff) << 0x10) |
  14. (((ushort)(v >> 0x10)).ByteSwap() & 0xffff));
  15. }
  16. public static ulong ByteSwap(this ulong v)
  17. {
  18. return (ulong)(((((uint)v).ByteSwap() & 0xffffffffL) << 0x20) |
  19. (((uint)(v >> 0x20)).ByteSwap() & 0xffffffffL));
  20. }
  21. public static short ByteSwap(this short v)
  22. {
  23. return (short)(((v & 0xff) << 8) | ((v >> 8) & 0xff));
  24. }
  25. public static int ByteSwap(this int v)
  26. {
  27. return (int)(((((short)v).ByteSwap() & 0xffff) << 0x10) |
  28. (((short)(v >> 0x10)).ByteSwap() & 0xffff));
  29. }
  30. public static long ByteSwap(this long v)
  31. {
  32. return (long)(((((int)v).ByteSwap() & 0xffffffffL) << 0x20) |
  33. (((int)(v >> 0x20)).ByteSwap() & 0xffffffffL));
  34. }
  35. #endregion
  36. #region NetworkToHostOrder
  37. public static short NetworkToHostOrder(this short value)
  38. {
  39. if (BitConverter.IsLittleEndian) return value.ByteSwap();
  40. return value;
  41. }
  42. public static int NetworkToHostOrder(this int value)
  43. {
  44. if (BitConverter.IsLittleEndian) return value.ByteSwap();
  45. return value;
  46. }
  47. public static long NetworkToHostOrder(this long value)
  48. {
  49. if (BitConverter.IsLittleEndian) return value.ByteSwap();
  50. return value;
  51. }
  52. public static ushort NetworkToHostOrder(this ushort value)
  53. {
  54. if (BitConverter.IsLittleEndian) return value.ByteSwap();
  55. return value;
  56. }
  57. public static uint NetworkToHostOrder(this uint value)
  58. {
  59. if (BitConverter.IsLittleEndian) return value.ByteSwap();
  60. return value;
  61. }
  62. public static ulong NetworkToHostOrder(this ulong value)
  63. {
  64. if (BitConverter.IsLittleEndian) return value.ByteSwap();
  65. return value;
  66. }
  67. #endregion NetworkToHostOrder
  68. #region HostToNetworkOrder
  69. public static short HostToNetworkOrder(this short value)
  70. {
  71. if (BitConverter.IsLittleEndian) return value.ByteSwap();
  72. return value;
  73. }
  74. public static int HostToNetworkOrder(this int value)
  75. {
  76. if (BitConverter.IsLittleEndian) return value.ByteSwap();
  77. return value;
  78. }
  79. public static long HostToNetworkOrder(this long value)
  80. {
  81. if (BitConverter.IsLittleEndian) return value.ByteSwap();
  82. return value;
  83. }
  84. public static ushort HostToNetworkOrder(this ushort value)
  85. {
  86. if (BitConverter.IsLittleEndian) return value.ByteSwap();
  87. return value;
  88. }
  89. public static uint HostToNetworkOrder(this uint value)
  90. {
  91. if (BitConverter.IsLittleEndian) return value.ByteSwap();
  92. return value;
  93. }
  94. public static ulong HostToNetworkOrder(this ulong value)
  95. {
  96. if (BitConverter.IsLittleEndian) return value.ByteSwap();
  97. return value;
  98. }
  99. #endregion HostToNetworkOrder
  100. }
  101. }