my-endian.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:1k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #include "my-endian.h"
  2.  
  3. /* rotates 2 bytes */
  4. unsigned short swap2(u_2bytes In) {
  5. u_2bytes Out;
  6. ((char*)&(Out))[0] = ((char*)&(In))[1];
  7. ((char*)&(Out))[1] = ((char*)&(In))[0];
  8. return Out;
  9. }
  10. /* rotates 4 bytes */
  11. u_4bytes rotate4(u_4bytes In) {
  12. u_4bytes Out;
  13. ((u_2bytes*)&Out)[0] = swap2(((u_2bytes*)&In)[1]);
  14. ((u_2bytes*)&Out)[1] = swap2(((u_2bytes*)&In)[0]);
  15. return Out;
  16. }
  17. /* detects endian-ness
  18.  * Note:   will not work if sizeof(unsigned long)==1
  19.  */
  20. int IsLittleEndian(void) {
  21. static const unsigned long long_number = 1;
  22. return *(const unsigned char *)&long_number;
  23. }
  24. /* changes endian-ness */
  25. void ToOtherEndian(TEntry *e) {
  26. /* unroll this loop if you want to enumerate u_4bytes members of TEntry_v2 */
  27. u_4bytes *p;
  28. for (p = &(e -> head.event_duration); p <= &(e -> url); p++)
  29. *p = rotate4(*p);
  30. e -> tail.status = swap2(e -> tail.status);
  31. if (sizeof(method_t) == 2)
  32. e -> tail.method = swap2(e -> tail.method);
  33. else
  34. if (sizeof(method_t) == 4)
  35. e -> tail.method = rotate4(e -> tail.method);
  36. if (sizeof(protocol_t) == 2)
  37. e -> tail.protocol = swap2(e -> tail.protocol);
  38. else
  39. if (sizeof(protocol_t) == 4)
  40. e -> tail.protocol = rotate4(e -> tail.protocol);
  41. }