endian.hpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /***************************************************************************
  2. * E-Com Technology Ltd.
  3. *
  4. * ECOMPACS DICOM Network Transport Libraries * Version 0.1 Beta
  5. ***************************************************************************/
  6. //////////////////////////////////////////////////////////////////////
  7. // Architectually Neutral Endian types.
  8. //
  9. // Note these are not done with C++ templates. This is a design choice.
  10. //////////////////////////////////////////////////////////////////////
  11. #if NATIVE_ENDIAN == LITTLE_ENDIAN
  12. //////////////////////////////////////////////////////////////////////
  13. // pack c1 and c2 into u1
  14. inline void Pack (BYTE c1, BYTE c2, UINT16 & u1)
  15. {
  16. u1 = ( ( (UINT16)c1)<<8)+ ( (UINT16)c2); // little endian
  17. }
  18. //////////////////////////////////////////////////////////////////////
  19. // unpack c1 and c2 from u1
  20. inline void Pack (UINT16 u1, BYTE & c1, BYTE & c2)
  21. {
  22. c1 = (u1 >> 8); // little endian
  23. c2 = (u1 & 0xff);
  24. }
  25. #else
  26. //////////////////////////////////////////////////////////////////////
  27. // pack c1 and c2 into u1
  28. inline void Pack (BYTE c1, BYTE c2, UINT16 & u1)
  29. {
  30. u1 = ( ( (UINT16)c2)<<8)+ ( (UINT16)c1); // big endian
  31. }
  32. //////////////////////////////////////////////////////////////////////
  33. // unpack c1 and c2 from u1
  34. inline void Pack (UINT16 u1, BYTE & c1, BYTE & c2)
  35. {
  36. c2 = (u1 >> 8); // big endian
  37. c1 = (u1 & 0xff);
  38. }
  39. #endif
  40. inline UINT16 SwitchEndian(UINT16 x)
  41. {
  42. return ( ((x >> 8) & 0x00ff) | ((x << 8) & 0xff00) );
  43. }
  44. inline UINT32 SwitchEndian(UINT32 x)
  45. {
  46. return ( ((UINT32) SwitchEndian ((UINT16) (x >> 16))) |
  47. ((UINT32) (SwitchEndian ((UINT16) (x & 0x0000ffff)) << 16) ));
  48. }
  49. inline INT16 SwitchEndian(INT16 x)
  50. {
  51. return ((INT16) SwitchEndian((UINT16) x) );
  52. }
  53. inline INT32 SwitchEndian(INT32 x)
  54. {
  55. return ((INT32) SwitchEndian((UINT32) x) );
  56. }
  57. #if NATIVE_ENDIAN == LITTLE_ENDIAN
  58. #define LE_UINT16 UINT16
  59. #define LE_UINT32 UINT32
  60. #define LE_INT16 INT16
  61. #define LE_INT32 INT32
  62. #define XE_UINTX BE_UINT16
  63. #define UINTX UINT16
  64. #undef XE_UINTX
  65. #undef UINTX
  66. #define XE_UINTX BE_UINT32
  67. #define UINTX UINT32
  68. #undef XE_UINTX
  69. #undef UINTX
  70. #define XE_UINTX BE_INT16
  71. #define UINTX INT16
  72. #undef XE_UINTX
  73. #undef UINTX
  74. #define XE_UINTX BE_INT32
  75. #define UINTX INT32
  76. #undef XE_UINTX
  77. #undef UINTX
  78. #else
  79. #define BE_UINT16 UINT16
  80. #define BE_UINT32 UINT32
  81. #define BE_INT16 INT16
  82. #define BE_INT32 INT32
  83. #define XE_UINTX LE_UINT16
  84. #define UINTX UINT16
  85. #undef XE_UINTX
  86. #undef UINTX
  87. #define XE_UINTX LE_UINT32
  88. #define UINTX UINT32
  89. #undef XE_UINTX
  90. #undef UINTX
  91. #define XE_UINTX LE_INT16
  92. #define UINTX INT16
  93. #undef XE_UINTX
  94. #undef UINTX
  95. #define XE_UINTX LE_INT32
  96. #define UINTX INT32
  97. #undef XE_UINTX
  98. #undef UINTX
  99. #endif