/core/endian.d

http://github.com/wilkie/djehuty · D · 171 lines · 133 code · 24 blank · 14 comment · 0 complexity · d7017aea3bdca642b93fe507afde4470 MD5 · raw file

  1. /*
  2. * endian.d
  3. *
  4. * This file contains some simple code to switch endian.
  5. *
  6. * Author: Dave Wilkinson
  7. *
  8. */
  9. module core.endian;
  10. // IntType FromBigEndian(IntType)
  11. // --------------------------------
  12. // converts big endian input to native byte order
  13. ulong FromBigEndian64(ulong input)
  14. {
  15. version(LittleEndian)
  16. {
  17. return (input >> 56) | ((input >> 40) & 0xFF00) | ((input >> 24) & 0xFF0000) | ((input >> 8) & 0xFF000000) | ((input << 8) & 0xFF00000000UL) | ((input << 24) & 0xFF0000000000UL) | ((input << 40) & 0xFF000000000000UL) | ((input << 56) & 0xFF00000000000000UL);
  18. }
  19. else
  20. {
  21. return input;
  22. }
  23. }
  24. uint FromBigEndian32(uint input)
  25. {
  26. version(LittleEndian)
  27. {
  28. return (input >> 24) | ((input >> 8) & 0xFF00) | ((input << 8) & 0xFF0000) | ((input << 24) & 0xFF000000);
  29. }
  30. else
  31. {
  32. return input;
  33. }
  34. }
  35. ushort FromBigEndian16(ushort input)
  36. {
  37. version(LittleEndian)
  38. {
  39. return cast(ushort)((cast(uint)input >> 8) | (cast(uint)input << 8));
  40. }
  41. else
  42. {
  43. return input;
  44. }
  45. }
  46. // IntType FromLittleEndian(IntType)
  47. // -----------------------------------
  48. // converts little endian input to native byte order
  49. ulong FromLittleEndian64(ulong input)
  50. {
  51. version(LittleEndian)
  52. {
  53. return input;
  54. }
  55. else
  56. {
  57. return (input >> 56) | ((input >> 40) & 0xFF00) | ((input >> 24) & 0xFF0000) | ((input >> 8) & 0xFF000000) | ((input << 8) & 0xFF00000000) | ((input << 24) & 0xFF0000000000) | ((input << 40) & 0xFF000000000000) | ((input << 56) & 0xFF00000000000000);
  58. }
  59. }
  60. uint FromLittleEndian32(uint input)
  61. {
  62. version(LittleEndian)
  63. {
  64. return input;
  65. }
  66. else
  67. {
  68. return (input >> 24) | ((input >> 8) & 0xFF00) | ((input << 8) & 0xFF0000) | ((input << 24) & 0xFF000000);
  69. }
  70. }
  71. ushort FromLittleEndian16(ushort input)
  72. {
  73. version(LittleEndian)
  74. {
  75. return input;
  76. }
  77. else
  78. {
  79. return (input >> 8) | (input << 8);
  80. }
  81. }
  82. ulong NativeToLE64(ulong input)
  83. {
  84. version (LittleEndian)
  85. {
  86. return input;
  87. }
  88. else
  89. {
  90. return FromLittleEndian64(input);
  91. }
  92. }
  93. uint NativeToLE32(uint input)
  94. {
  95. version (LittleEndian)
  96. {
  97. return input;
  98. }
  99. else
  100. {
  101. return FromLittleEndian32(input);
  102. }
  103. }
  104. ushort NativeToLE16(ushort input)
  105. {
  106. version (LittleEndian)
  107. {
  108. return input;
  109. }
  110. else
  111. {
  112. return FromLittleEndian16(input);
  113. }
  114. }
  115. ulong NativeToBE64(ulong input)
  116. {
  117. version (LittleEndian)
  118. {
  119. return FromBigEndian64(input);
  120. }
  121. else
  122. {
  123. return input;
  124. }
  125. }
  126. uint NativeToBE32(uint input)
  127. {
  128. version (LittleEndian)
  129. {
  130. return FromBigEndian32(input);
  131. }
  132. else
  133. {
  134. return input;
  135. }
  136. }
  137. ushort NativeToBE16(ushort input)
  138. {
  139. version (LittleEndian)
  140. {
  141. return FromBigEndian16(input);
  142. }
  143. else
  144. {
  145. return input;
  146. }
  147. }