专栏首页信安本原字节序转换详解

字节序转换详解

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

目录

0x01 概念

0x02 分类

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

0x01 概念

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

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

0x02 分类

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

本文分享自微信公众号 - 无心的梦呓(wuxinmengyi),作者:Vesel无心

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux目录结构及开机流程详解

    对Linux有一些了解的,都应该知道在Linux中所有的内容都是文件,包括硬盘等各种硬件在Linux中也都是按照文件来继续处理的,所以对Linux文件的了解将是...

    信安本原
  • Linux特殊权限详解

    实际上Linux有12位权限,我们前面说的Linux权限都只说了常用的9位权限,剩下的特殊权限也经常被用来进行Linux提权,如果没有了解了的,可以移步之前的文...

    信安本原
  • Linux用户管理学习

    skel目录是用来存放新用户配置文件的目录,当添加新用户的时候,会自动将这个目录下的所有文件复制到新用户的家目录下,可以通过修改skel目录下的文件来对新用户初...

    信安本原
  • 脑残式网络编程入门(九):面试必考,史上最通俗大小端字节序详解

    最近在从头重写 MobileIMSDK 的TCP版,自已组织TCP数据帧时就遇到了字节序大小端问题。所以,借这个机会单独整理了这篇文章,希望能加深大家对字节序问...

    JackJiang
  • 字节和字符

    位(bit):是计算机 内部数据 储存的最小单位,11001100是一个八位二进制数。

    泰斗贤若如
  • 脑残式网络编程入门(九):面试必考,史上最通俗大小端字节序详解

    最近在从头重写 MobileIMSDK 的TCP版,自已组织TCP数据帧时就遇到了字节序大小端问题。所以,借这个机会单独整理了这篇文章,希望能加深大家对字节序问...

    JackJiang
  • UTF8变长编码

    首先要说明的是我们所有的信息都是以二进制字节的形式保存的,比如00000000这样的8个0就代表一个字节了。

    小蜜蜂
  • 计算机编码基础

         乱码是我们在日常的工作中经常遇到的问题,你可能从网上好不容易下载了一个炫酷的jQuery插件,但是却在打开的时候,发现某几个js文件都是类似“澶у0?...

    Single
  • mysql 数据类型及占用字节数

    秋日芒草
  • 刨根究底字符编码之九——字符编码方案的演变与字节序

    前文已经提及,编号字符集CCS(简称字符集)与字符编码方式CEF(简称编码方式)这两个概念,在早期并没有必要严格区分。

    用户1876609

扫码关注云+社区

领取腾讯云代金券