字节序 —— Big Endian 和 Little Endian

一、字节序

字节序指的是多字节的数据在内存中的存放顺序

内存有高地址端与低地址端。其中,低地址端既可以存放高位字节,也可以存放低位字节。

  • Big Endian 是指低地址端 存放 高位字节。
  • Little Endian 是指低地址端 存放 低位字节。

二、为什么要注意字节序

如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。

但是,如果你的程序要跟别人的程序产生交互呢? 比如,当一个 C/C++ 的程序要与一个 Java 程序交互时:

  • C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而现在比较普遍的 x86 处理器是 Little Endian
  • JAVA编写的程序则唯一采用 Big Endian 方式来存储数据

试想,如果你的C/C++程序将变量 a = 0x12345678 的首地址传递给了Java程序,由于Java采取 Big Endian 方式存储数据,很自然的它会将你的数据翻译为 0x78563412。显然,问题就出现了!!!

另外,网络传输一般采用 Big Endian,也被称之为网络字节序,或网络序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。

三、网络序与主机序

网络字节序:TCP/IP各层协议将字节序定义为 Big Endian,因此TCP/IP协议中使用的字节序是大端序。

主机字节序:整数在内存中存储的顺序,现在 Little Endian 比较普遍。(不同的 CPU 有不同的字节序)

在进行网络通信时 通常需要调用相应的函数进行主机序和网络序的转换。Berkeley socket API 定义了一组转换函数,用于16和32bit整数在网络序和本机字节序之间的转换。htonl,htons用于本机序转换到网络序;ntohl,ntohs用于网络序转换到本机序。

233



https://songlee24.github.io/2015/05/02/endianess/

原文地址:https://www.cnblogs.com/lemos/p/12004074.html

时间: 2024-08-04 05:55:52

字节序 —— Big Endian 和 Little Endian的相关文章

理解字节序 [Understanding Big and Little Endian Byte Order]

原文地址 (本文对于字节序讲解的很清楚,容易理解.) Problems with byte order are frustrating, and I want to spare you the grief I experienced. Here's the key: Problem: Computers speak different languages, like people. Some write data "left-to-right" and others "rig

c# 主机和网络字节序的转换 关于网络字节序和主机字节序的转换

最近使用C#进行网络开发,需要处理ISO8583报文,由于其中有些域是数值型的,于是在传输的时候涉及到了字节序的转换. 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有两种字节顺序,根据他们所处的位置我们分别称为主机节序和网络字节序. 通常我们认为网络字节序为标准顺序,封包的时候,将主机字节序转换为网络字节序,拆包的时候要将网络字节序转换为主机字节序. 原以为还要自己写函数,其实网络库已经提供了. 主机到网络:short/int/long IPAddress.HostToNet

网络字节序与主机字节序

最近在项目开发过程中,需要在采用JAVA作为语言的服务器与采用C++作为语言的服务器间进行通信,这就涉及到这两种语言间数据类型的转换以及网络字节序与主机字节序的区别.该文主要说说网络字节序和主机字节序的区别以及Little endian与Big endian的概念.其实编程的事就比较简单了   我也懒得写了,直接引用了我觉得写的挺好的两篇文章: 什么是Big Endian和Little Endian? 来源:http://blog.ednchina.com/qinyonglyz/194674/m

网络字节序与主机字节序 高低位

最近在项目开发过程中,需要在采用JAVA作为语言的服务器与采用C++作为语言的服务器间进行通信,这就涉及到这两种语言间数据类型的转换以及网络字节序与主机字节序的区别.该文主要说说网络字节序和主机字节序的区别以及Little endian与Big endian的概念.其实编程的事就比较简单了   我也懒得写了,直接引用了我觉得写的挺好的两篇文章: 什么是Big Endian和Little Endian? 来源:http://blog.ednchina.com/qinyonglyz/194674/m

主机字节序 和 网络字节序

不同的CPU有不同的字节序类型,这些字节序是指 整数 在内存中保存的顺序,这个叫做 主机序. 最常见的有两种: 1.Little endian:将低序字节存储在起始地址 2.Big endian:将高序字节存储在起始地址 LE little-endian(小端) 最符合人的思维的字节序: 地址低位存储值的低位: 地址高位存储值的高位: 怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说: 低位值小,就应该放在内存地址小的地方,也即内存地址低位: 反之,高位值就应该放在内存地址大的地方,也即

c语言获得ip地址以及一些字节序问题记录

https://docs.microsoft.com/zh-cn/windows/win32/api/iphlpapi/nf-iphlpapi-getipaddrtable msdn,有很多c的源码还有解释. 主机一般是小端,小的放在地址第一位.网络字节序一般是hi大端,大的放在地址第一位. Part 1: htons函数具体解释     在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序. 在Intel机器下,执行以下程序 int m

字节序转换与结构体位域(bit field)值的读取 Part 2 - 深入理解字节序和结构体位域存储方式

上一篇文章讲解了带位域的结构体,在从大端机(Big Endian)传输到小端机(Little Endian)后如何解析位域值.下面继续深入详解字节序,以及位域存储的方式. (1) 我们知道,存储数字时,对小端机而言,数字的低位,存在低地址,高位存在高地址.大端机正相反. (2) 读取的方式,也是一样的.对于小端机,读出的低地址位作为数字的低位. (3) 此外Big-Endian/Little-Endian存储顺序,不仅仅针对字节,还针对字节内的比特位.对于小端机而言,字节内的8个比特,低地址端比

大端和小端(big endian little endian)

一.大端和小端的问题 对于整型.长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian 则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放据的低位字节到高位字节). 例如,假设从内存地址 0x0000 开始有以下数据:  0x0000         0x0001       0x0002       0x0003  0x12            0x34          

字节序

1.什么是字节序 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序.由于数据在内存中存储的顺序与操作系统有关,因此字节在主机中的存储顺序通常称为主机序:而数据在网络中的存储顺序则称为网络序. 常见的字节序有:大端字节序(Big endian)与小端字节序(Little endian). 主机序依CPU而定:Intel x86为Little endian,Motorola680x则是Big endian. 网络序与CPU无关都是Big endian, 这是因为统一字节序有利于数