字节序转换详解

摘要:
在跨平台和网络编程中,我们经常提到网络字节顺序和主机字节顺序。如果两者没有正确转换,导致双方的解释不同,就会出现意外的错误。0x03两个字节顺序之间的区别通常是,我们的主机字节顺序是小端字节顺序,而网络字节顺序是大端字节顺序。但我们为什么要皈依呢?如果我们不改变信仰会发生什么?让我们用不恰当的方式解释一下。

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

免责声明:文章转载自《字节序转换详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# 对象二进制序列化jqgrid 事件说明下篇

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

相关文章

大端法、小端法、网络字节序

关于字节序(大端法、小端法)的定义 《UNXI网络编程》定义:术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址。小端存在起始地址,即是小端字节序;大端存在起始地址,即是大端字节序。   也可以说:  1.小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端。  2....

搞懂iobuffer就得先学习bytebuffer

ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰。 《程序员的思维修炼》一本书讲过,主动学习,要比单纯看资料效果来的好,所以干脆写个详细点的文章来记录一下。 概述 ByteBuffer是NIO里用得最多的Buffer,它包含两个实现方式:HeapByteBuffer是基于Java堆的实现,而DirectByteBuffer则...

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

    ​最近在项目中的soket通信时,遇到了大小字节序问题和网络传输时的字节序问题,现在给大家整理一下,希望大家对字节序有个比较深入的了解,其实理解了就很简单的。    ​    ​开始遇到的问题:      1、本地的数据通过网络传输然后在目的地解析网络上的数据,字节序是如何统一的      2、字节序不同,数据(如0xFF00)存入内存地址中位置不...

TLV(类型—长度—值)格式及编码

转自:http://www.cnblogs.com/tml839720759/archive/2014/07/13/3841820.html 引子:   前段时间在项目中第一次接触TLV,项目中用这种格式来传输图片,语音等。 关于TLV   TLV是一种可变的格式,意为:Type类型, Lenght长度,Value值。Type:该字段是关于标签和编码格式的...

基础概念——何为大小端

首先不管是大端法还是小端法存储,计算机在内存中存放数据的顺序都是从低地址到高地址,所不同的是首先取低字节的数据存放在低地址还是取高字节数据存放在低地址。 若首先取高字节的数据存放在低地址,则是大端法; 若首先取低字节的数据存放在低地址,则是小端法;   例如有数据0x01234567 (注意:左边是高字节,右边是低字节) 大端法存放: 存放的地址依次为:0...

Unicode 字符集与它的编码方式

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