`

主机字节序与网络字节序

阅读更多

主机字节序
不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序
最常见的有两种
1. Little endian:将低序字节存储在起始地址
2. Big endian:将高序字节存储在起始地址


LE little-endian
最符合人的思维的字节序
地址低位存储值的低位
地址高位存储值的高位
怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说
低位值小,就应该放在内存地址小的地方,也即内存地址低位
反之,高位值就应该放在内存地址大的地方,也即内存地址高位


BE big-endian
最直观的字节序
地址低位存储值的高位
地址高位存储值的低位
为什么说直观,不要考虑对应关系
只需要把内存地址从左到右按照由低到高的顺序写出
把值按照通常的高位到低位的顺序写出
两者对照,一个字节一个字节的填充进去


例子:在内存中双字0x01020304(DWORD)的存储方式
内存地址
4000 4001 4002 4003
LE 04 03 02 01
BE 01 02 03 04


例子:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
      big-endian   little-endian
0x0000   0x12       0xcd
0x0001   0x34       0xab
0x0002   0xab       0x34
0x0003   0xcd       0x12
x86系列CPU都是little-endian的字节序.

网络字节序
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。
为了进行转换 bsd socket提供了转换的函数 有下面四个
htons 把unsigned short类型从主机序转换到网络序
htonl 把unsigned long类型从主机序转换到网络序
ntohs 把unsigned short类型从网络序转换到主机序
ntohl 把unsigned long类型从网络序转换到主机序
在使用little endian的系统中 这些函数会把字节序进行转换
在使用big endian类型的系统中 这些函数会定义成空宏
同样 在网络程序开发时 或是跨平台开发时 也应该注意保证只用一种字节序 不然两方的解释不一样就会产生bug.


注:
1、网络与主机字节转换函数:htons ntohs htonl ntohl (s 就是short l是long h是host n是network)
2、不同的CPU上运行不同的操作系统,字节序也是不同的,参见下表。
处理器     操作系统     字节排序
Alpha     全部     Little endian
HP-PA     NT     Little endian
HP-PA     UNIX     Big endian
Intelx86     全部     Little endian  

<!--v:3.2-->

分享到:
评论

相关推荐

    浅学字节序——字节序大小端,主机字节序,网络字节序的理解

    ### 主机字节序与网络字节序 #### 主机字节序 主机字节序指的是本地计算机系统的字节序。根据所使用的处理器类型和操作系统,主机字节序可能是大端或小端。例如,大多数基于x86架构的个人电脑使用小端字节序。 ##...

    IP、主机字节序、网络字节序、互转

    IP、主机字节序、网络字节序、互转 ------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using ...

    网络字节序和主机字节序

    网络字节序和主机字节序 在计算机科学中,字节序(Endianness)是指整数在内存中保存的顺序。不同的 CPU 有不同的字节序类型,这些字节序是指整数在内存中保存的顺序,这个叫做主机序。 常见的有两种字节序:...

    利用宏将网络字节序和主机字节序ip格式化输出方法

    利用宏将网络字节序和主机字节序ip格式化输出为字符串ip

    网络字节序与主机字节序

    网络字节序与主机字节序

    大小端字节序介绍几转换

    在C++中,可以使用以下四个函数来完成主机字节序与网络字节序之间的转换: - `htons(unsigned short hostShort)`:将主机字节序的16位整数转换为网络字节序。 - `htonl(unsigned long hostLong)`:将主机字节序的32...

    网络字节序 主机字节序.txt

    网络字节序 主机字节序

    c++和python如何实现主机字节序和网络字节序的相互转换

    在上一篇文章网络编程:主机字节序和网络字节序中,介绍了主机字节序和网络字节序的基本概念以及在实际的编程中,何时需要进行网络字节序和主机字节序的转换。本篇文章着重介绍使用c++和python语言,如何实现主机...

    判断主机字节序的C代码

    用C语言写的判断主机字节序的代码,一共有2种方法判断

    络字节序、地址转换源代码

    1. `htons()`(Host to Network Short):将主机字节序的短整型(16位)转换为网络字节序。 2. `ntohs()`(Network to Host Short):将网络字节序的短整型转换为主机字节序。 3. `htonl()`(Host to Network Long)...

    判断主机字节序大小端

    判断主机到底是大端还是小端的c程序!利用位置判断

    socket网络编程教程

    在了解socket网络编程之前,我们需要掌握一些基础知识,例如主机字节序与网络字节序的概念及它们之间的转换、socket地址结构以及C/S网络编程的基本流程。 ### 主机字节序与网络字节序 主机字节序指的是特定计算机...

    linux网络编程[收集].pdf

    因此,当主机字节序与网络字节序不一致时,需要进行字节序转换。在Linux中,可以使用`arpa/inet.h`头文件提供的函数进行转换: - `htonl(uint32_t hostlong)`:将32位的主机字节序长整数转换为网络字节序。 - `...

    endian:一个小的golang库,可帮助处理主机到网络和网络到主机的字节序转换

    尾数 一个小的golang库,可帮助处理主机到网络和网络到主机的字节序转换免责声明在使用此库之前,请阅读并了解Rob Pike的有关的博客文章。 长话短说,每当您需要担心代码是在小型字节序还是大型字节序计算机上运行时...

    5_网络字节序_werevj4_

    在跨平台的网络编程中,字节序转换函数如htonl(主机到网络字节序,long)、ntohl(网络到主机字节序,long)、htons(主机到网络字节序,short)和ntohs(网络到主机字节序,short)非常常见,它们确保数据在网络上...

    Socket开发资料

    主机字节序和网络字节序 主机字节序即内存中存储字节的方法有: 1. Little endian:将低序字节存储在起始地址 2. Big endian:将高序字节存储在起始地址 网络字序表示网络协议在处理多字节时的顺序,一律为big ...

    网络字节序_werevj4_源码.rar

    例如,`htonl`函数将主机字节序的32位整数转换为网络字节序,`ntohl`则是将网络字节序的32位整数转换回主机字节序。 在实际编程中,我们还需要考虑到字节序问题可能影响到的数据结构,比如结构体(struct)。如果...

    Socket编程详解

    在进行Socket编程之前,理解基本概念非常重要,这些概念包括主机字节序与网络字节序的区别、缓冲区的作用以及通信域的定义等。 ##### 主机字节序与网络字节序 计算机在处理多字节数据时存在不同的字节顺序。主机...

    Scoket 资料Scoket 资料

    #### 一、主机字节序与网络字节序 在网络通信过程中,不同系统间的数据交换必须遵循一致的数据格式规范。字节序是指在计算机内存中多字节数据类型的高低字节的排列顺序。主机字节序指的是特定硬件平台上的字节顺序...

    Socket_编程_参考

    #### 一、主机字节序与网络字节序 在计算机科学领域,数据的存储和传输通常涉及到字节序的问题。字节序指的是在一个多字节的数据类型中,字节之间的相对顺序。主要分为两种:小端字节序(Little Endian)和大端字节序...

Global site tag (gtag.js) - Google Analytics