大小端总结

网友投稿 426 2022-11-15

大小端总结

概念

大端 :高字节存放到内存的低地址

小端: 高字节存放到内存的高地址

例如:

注意:

一个字节的整型和char 型不存在大小端说法

因为字节序中的低位和高位仅针对大于1个字节的组合内存空间(自己定义的名词,就是值的大小是要多个内存单元组合而成,比如多字节整数 uint32_t 是4个字节

当通过网络发送多字节整数的时候需要进行网络自己序的转化,将字节序转成大端模式,收到包后再通过转化成小端模式

判断大小端模式

uint32_t a = 1; char* p = (char*)&a; if(*p == 1) { std::cout << "little"<< std::endl; } else { std::cout << "big"<< std::endl; }

大小端转化

大端转小端

#define _SWAP_U16_(v) ((((v)&0x00FF) << 8) | (((v)&0xFF00) >> 8))#define _SWAP_U32_(v) ((_SWAP_U16_(v) << 16) | (_SWAP_U16_(v >> 16)))#define _SWAP_U64_(v) ((_SWAP_U32_(v) << 32) | (_SWAP_U32_(v >> 32)))

小端转大端,大端存储方式

void write_field_64(buffer_t *buffer, uint64_t val){ unsigned char bytes[8]; bytes[0] = ((uint64_t)val >> 56) & 0xFF; bytes[1] = ((uint64_t)val >> 48) & 0xFF; bytes[2] = ((uint64_t)val >> 40) & 0xFF; bytes[3] = ((uint64_t)val >> 32) & 0xFF; bytes[4] = ((uint64_t)val >> 24) & 0xFF; bytes[5] = ((uint64_t)val >> 16) & 0xFF; bytes[6] = ((uint64_t)val >> 8) & 0xFF; bytes[7] = (uint64_t)val & 0xFF; return ;}void write_field_32(buffer_t *buffer, uint32_t val) { unsigned char bytes[4]; bytes[0] = ((uint32_t)val >> 24) & 0xFF; bytes[1] = ((uint32_t)val >> 16) & 0xFF; bytes[2] = ((uint32_t)val >> 8) & 0xFF; bytes[3] = (uint32_t)val & 0xFF; return ;}void write_field_24(buffer_t *buffer, uint32_t val) { unsigned char bytes[3]; bytes[0] = ((uint32_t)val >> 16) & 0xFF; bytes[1] = ((uint32_t)val >> 8) & 0xFF; bytes[2] = (uint32_t)val & 0xFF; return ;}void write_field_16(buffer_t *buffer, uint16_t val) { unsigned char bytes[2]; bytes[0] = ((uint32_t)val >> 8) & 0xFF; bytes[1] = (uint32_t)val & 0xFF; return ;}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:开源项目丨一文详解一站式大数据平台运维管家 ChengYing 如何部署 Hadoop 集群
下一篇:来自CaptoGlove的触觉反馈和XR接口
相关文章

 发表评论

暂时没有评论,来抢沙发吧~