hendian.h 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #ifndef HW_ENDIAN_H_
  2. #define HW_ENDIAN_H_
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "hdef.h"
  6. #define LITTLE_ENDIAN 0
  7. #define BIG_ENDIAN 1
  8. #define NET_ENDIAN BIG_ENDIAN
  9. int check_endian() {
  10. union {
  11. char c;
  12. short s;
  13. } u;
  14. u.s = 0x1122;
  15. if (u.c == 0x11) {
  16. return BIG_ENDIAN;
  17. }
  18. return LITTLE_ENDIAN;
  19. }
  20. template <typename T>
  21. uint8* serialize(uint8* buf, T value, int host_endian = LITTLE_ENDIAN, int buf_endian = BIG_ENDIAN) {
  22. size_t size = sizeof(T);
  23. uint8* pDst = buf;
  24. uint8* pSrc = (uint8*)&value;
  25. if (host_endian == buf_endian) {
  26. memcpy(pDst, pSrc, size);
  27. } else {
  28. for (int i = 0; i < size; ++i) {
  29. pDst[i] = pSrc[size-i-1];
  30. }
  31. }
  32. return buf+size;
  33. }
  34. template <typename T>
  35. uint8* deserialize(uint8* buf, T* value, int host_endian = LITTLE_ENDIAN, int buf_endian = BIG_ENDIAN) {
  36. size_t size = sizeof(T);
  37. uint8* pSrc = buf;
  38. uint8* pDst = (uint8*)value;
  39. if (host_endian == buf_endian) {
  40. memcpy(pDst, pSrc, size);
  41. } else {
  42. for (int i = 0; i < size; ++i) {
  43. pDst[i] = pSrc[size-i-1];
  44. }
  45. }
  46. return buf+size;
  47. }
  48. #endif // HW_ENDIAN_H_