前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >字节序转换详解

字节序转换详解

作者头像
信安本原
发布2020-03-08 16:48:38
1.2K0
发布2020-03-08 16:48:38
举报
文章被收录于专栏:信安本原信安本原

在跨平台和网络编程中我们经常会提到网络字节序和主机字节序,如果没有正确对两者进行转换,从而导致两方产生了不同的解释,就会出现意想不到的bug。

目录

0x01 概念

0x02 分类

0x03 两种字节序之间的区别

0x01 概念

字节序,就是大于一个字节类型的数据在内存中的存放顺序。

注:网络字节序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释,网络字节序采用大端排序方式。

0x02 分类

字节序经常被分为大端和小端两种

Big-Endian(大端):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

Little-Endian(小端):低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

0x03 两种字节序之间的区别

通常我们的主机字节序是小端字节序,网络字节序是大端字节序,但是为什么要进行转换呢,如果不转换的话会发生什么,我们这里用一个不是很恰当的方式来解释一下。

我们假设使用大端的方式发送一个16bit的数据2,即0000000000000010

使用小端字节序存储的话,是这个样子的

而大端存储是下面这个样子的

虽然两者看起来仅仅只是存放的先后顺序不一样,但是如果不做相应的转换的话,将会导致所读取的数据完全不同

这里还拿上面的这个图来说

当我们使用小端方式来读的时候会出现下面这样的状况

由于先将00000010存储了,在读取的时候会先将它读出来,数据就变成了0000001000000000即512,而不是当时所要输入的数字2。

而此时继续通过大端方式来读取就会获取正常的数据值

通过上面的这个方式便很容易的清楚了不重视两种存储方式而造成的后果

最后用网上的一个图来展示一下转换的传输过程

在C++编程中,我们通过使用htonl、ntohl、htons、ntohs来进行转换的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 无心的梦呓 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档