大小字节序的深入理解和鉴定系统字节序方法

摘要:
最近,我们在项目的套接字通信中遇到了大小字节顺序的问题以及网络传输中的字节顺序问题。现在让我们为您整理一下。我希望你能对字节顺序有更深入的理解。事实上,理解它很简单。首先遇到的问题:1.本地数据通过网络传输,然后在目的地解析网络上的数据。字节顺序是如何统一的?2.字节顺序不同,数据(如0xFF00)存储在存储器地址的不同位置(大字节顺序:FF——低地址位00——高地址位;小字节顺序:

    ​最近在项目中的soket通信时,遇到了大小字节序问题和网络传输时的字节序问题,现在给大家整理一下,希望大家对字节序有个比较深入的了解,其实理解了就很简单的。
    ​    ​开始遇到的问题:
      1、本地的数据通过网络传输然后在目的地解析网络上的数据,字节序是如何统一的
      2、字节序不同,数据(如0xFF00)存入内存地址中位置不同(大字节序:FF--低地址位   00--高地址位  ;小字节序: 00--低地址位  FF--高地址位),为什么读出的值都是0xFF00
    ​    ​下面让我们带着问题来理解:
    ​    ​ 大字节序:大端有效 ,高位数据先放入低地址内存  , 低位数据再放入高地址内存
    ​    ​小字节序:小端有效,低位数据先放入低地址内存 , 高位数据再放入高地址内存   ​    ​
    ​    ​注意:描述的是将数据(肉眼看到的)放入内存中的地址(计算机的硬盘内存中)
    ​    ​然后看一下图示吧:

   大小字节序的深入理解和鉴定系统字节序方法第1张


    ​   相信大家对遇到的第二个问题已经知道答案了吧,现在再来看看第一个问题。
    ​   ​网络字节序:是大字节序,在把数据进行网络传输时,要保证自己传输到网络上的数据时大字节序。
       再来看看图示吧:

大小字节序的深入理解和鉴定系统字节序方法第2张

    ​1号线路:发数据和接收数据都不需要转序,因为自己是和网络都是大字节序
    ​2号线路:发数据和接收数据都需要转序,因为自己是小字节序,网络都是大字节序,才能保证自己本系统的数据永远都是小字节序。可能高级语言(java、C#屏蔽了字节序,大家感受不到,那是因为高级语言内存进行封装和处理了)
    ​好了,现在大家对第一个问题也清楚了吧。
    ​最后让我们来看看鉴定大小字节序的C语言程序吧

​#include <stdlib.h>
#include <string.h>

int main()
{
/*将结合体的整型值赋值为1,如果是小字节序,小端有效,低地址写入的就是1,读出字符ch就是1 
如果是大字节序,大端有效,低地址写入的就是0,读出字符ch就是0*/
data.i = 1;
if(data.ch)
{
printf("this system is  small-endian
");
} 
else
{
printf("this system is  big-endian
");
}

return 0;
} 

  原因:将结合体的整型值赋值为1,如果是小字节序,小端有效,低地址写入的就是1,读出字符ch就是1 
    ​    ​    ​    ​    ​    ​    ​          ​如果是大字节序,大端有效,低地址写入的就是0,读出字符ch就是0
    ​检验大小字节序的方法很多,本人认为这个方法比较简单,容易理解。


    ​最后希望能对大家有帮助,有什么问题请留言,谢谢。

免责声明:文章转载自《大小字节序的深入理解和鉴定系统字节序方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇input type = number 去除上下箭头,禁用滚轮事件(默认的自带滚轮加减数字)ffmpeg使用参数说明下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

几种编码方式

这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级。整理这篇文章的动机是两个问题:问题一:使用Windows记事本的“另存为”,可以在GBK、Unicode、Unicode big endian和UTF-8这几种编码方式间相互转换。同样是txt文件,Windows是怎样识别编码方式的呢?...

《游戏引擎架构》笔记三

C++基础复习 面向对象的三个基本特征是:封装、继承、多态。其中,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了代码重用。而多态则是为了实现接口重用。 封装 它是指对象只对外提供有限的接口,隐藏对象内部状态和实现细节。 继承 它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。其继承...

理解字节序 大端字节序和小端字节序

以下内容参考了 http://www.ruanyifeng.com/blog/2016/11/byte-order.html https://blog.csdn.net/yishengzhiai005/article/details/39672529 计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endia...

Unicode 字符集与它的编码方式

正式内容開始之前,我们先来了解一个基本概念,编码字符集。 编码字符集:编码字符集是一个字符集,它为每个字符分配一个唯一数字。Unicode 标准的核心是一个编码字符集,字母“A”的编码为 004116 和字符“”的编码为 20AC16。Unicode 标准始终使用十六进制数字,并且在书写时在前面加上前缀“U+”,所以“A”的编码书写为“U+0041”。...

UNIX网络编程——网络IPC:套接字

Contents 套接字接口 套接字描述符 寻址 字节序 地址格式 地址查询 绑定地址 建立连接 数据传输 套接字选项 带外数据 UNIX域套接字 使用套接字的示例 面向连接的ruptime 无连接的ruptime 套接字接口       套接字接口是一组用来结合UNIX I/O函数进行进程间通信的函数,大多数系统上都实现了它,包括各...

linux网路编程:字节序(大端、小端、网络、主机)

字节序:就是数据在内存中的存放顺序,也可称之为端模式。 大端模式和小端模式的定义 1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。 3) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/...