C语言小知识(基于Linux)——个人笔记,不定时更新 (2)

  在数据流跨平台的传递中,经常会遇到大小端不对齐的情况;比如一个int数据在大端机器中的存储方式是高位在前,低位在后

    比如0x33224411在内存中的存放方式就是先存0x33,再存0x22,以此类推。如下:

      buf[0] = 0x33;

      buf[1] = 0x22;

      buf[2] = 0x44;

      buf[3] = 0x11;

  而小端平台就刚好相反,是低位在前,高位在后;同样的数据0x33224411在小端中的存放方式就是先存0x11,再存0x44,以此类推。如下:

      buf[0] = 0x11;

      buf[1] = 0x44;

      buf[2] = 0x22;

      buf[3] = 0x33;

  为了使数据统一,所以一般规定了在网络中传输的数据都以大端模式传递,收到数据之后再把数据从大端模式转为本机的模式即可正常使用;

    在linux系统的#include <endian.h>中提供了一系类字节序转换的函数:

      #include <endian.h>

      // 将主机字节序转换为大端字节序

      uint16_t   htobe16(uint16_t   host_16bits);

      uint32_t   htobe32(uint32_t   host_32bits);

      uint64_t   htobe64(uint64_t   host_64bits);

 

      // 将主机字节序转换为小端字节序
      uint16_t   htole16(uint16_t   host_16bits);
      uint32_t   htole32(uint32_t   host_32bits);
      uint64_t   htole64(uint64_t   host_64bits);

 

      // 将大端字节序转换为主机字节序
      uint16_t   be16toh(uint16_t   big_endian_16bits);
      uint32_t   be32toh(uint32_t   big_endian_32bits);
      uint64_t   be64toh(uint64_t   big_endian_64bits);

 

      // 将小端字节序转换为主机字节序
      uint16_t   le16toh(uint16_t   little_endian_16bits);      

      uint32_t   le32toh(uint32_t   little_endian_32bits);      

      uint64_t   le64toh(uint64_t   little_endian_64bits);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyjjxf.html