随笔 - 51, 文章 - 1, 评论 - 41, 引用 - 0
数据加载中……

CPPEXP —— 字节序(大小端)

说明

big endian和little endian表示如何存放多字节数据。前者低位字节排放在内存的高端,后者相反。将unsigned long数据强制转换成unsigned char*数据,则它们在两种模式下的对应关系如下:

big endian:

ul = (uc[0]<< 24) + (uc[1]<<16) + (uc[2]<<8) + uc[3];

little endian:

ul = (uc[3]<<24) + (uc[2]<<16) + (uc[1]<<8) + uc[0];

实验代码

  1. /**
  2. * @file little_big_endian.cpp
  3. * @brief 测试大小端字节序
  4. * @copyright public domain
  5. */
  6. #include <iostream>
  7. static bool is_little_endian() {
  8. union {
  9. long l;
  10. char cs[4];
  11. } t;
  12. t.l = 1;
  13. return t.cs[0] == 1;
  14. }
  15. int main() {
  16. unsigned long ul = 0x12345678;
  17. unsigned char* uc = (unsigned char*)&ul;
  18. if (is_little_endian()) {
  19. bool r = (uc[0] + (uc[1]<<8) + (uc[2]<<16) + (uc[3]<<24)) == ul;
  20. std::cout << "little: (uc[0] + (uc[1]<<8) + (uc[2]<<16) + (uc[3]<<24)) == ul is " << (r ? "true" : "false") << std::endl;
  21. } else {
  22. bool r = (uc[3] + (uc[2]<<8) + (uc[1]<<16) + (uc[0]<<24)) == ul;
  23. std::cout << "little: (uc[3] + (uc[2]<<8) + (uc[1]<<16) + (uc[0]<<24)) == ul is " << (r ? "true" : "false") << std::endl;
  24. }
  25. return 0;
  26. }

运行及结果

$ g++ little_big_endian.cpp 
$ ./a.out 
little: (uc[0] + (uc[1]<<8) + (uc[2]<<16) + (uc[3]<<24)) == ul is true

常见问题

字节序的问题容易出现在不同电脑交互数据的时候,因此当数据输出时——保存成文件或在网络上传输——就应该考虑字节序。





posted on 2016-04-19 20:39 lemene 阅读(306) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理