字节序转换详解

在跨平台和网络编程中咱们常常会提到网络字节序和主机字节序,若是没有正确对二者进行转换,从而致使两方产生了不一样的解释,就会出现意想不到的bug。编程

目录

0x01 概念网络

0x02 分类操作系统

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

0x01 概念

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

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

0x02 分类

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

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

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

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

一般咱们的主机字节序是小端字节序,网络字节序是大端字节序,可是为何要进行转换呢,若是不转换的话会发生什么,咱们这里用一个不是很恰当的方式来解释一下。博客

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

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

file

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

file

虽然二者看起来仅仅只是存放的前后顺序不同,可是若是不作相应的转换的话,将会致使所读取的数据彻底不一样

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

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

file

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

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

file

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

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

file

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

本文由博客一文多发平台 OpenWrite 发布!

相关文章
相关标签/搜索