zoukankan      html  css  js  c++  java
  • 字节序转换详解

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

    目录

    0x01 概念

    0x02 分类

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

    0x01 概念

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

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

    0x02 分类

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

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

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

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

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

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

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

    file

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

    file

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

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

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

    file

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

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

    file

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

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

    file

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

    文章首发公众号:无心的梦呓(wuxinmengyi)

    这是一个记录红队学习、信安笔记,个人成长的公众号

    扫码关注即可

    file

  • 相关阅读:
    043_生成随机密码
    042_提示用户输入年份后测试判断是否为闰年
    041_查找 Linux 系统中的僵尸进程
    040_删除某个目录下大小为 0 的文件
    039_显示 CPU 厂商信息
    038_使用脚本自动创建逻辑卷
    037_自动添加防火墙规则,开启某些服务或端口(适用于 RHEL7)
    bzoj1537
    bzoj2466
    bzoj1047
  • 原文地址:https://www.cnblogs.com/wuxinmengyi/p/11697622.html
Copyright © 2011-2022 走看看