写在最前面

由于以前学习过相关内容,这里只记录一些重点,不会按照目录一步步记录。

同时此课程重在实践,所以后续会有较多的实践操作。

进制及进制的转换

二进制十六进制八进制十进制之间的转换公式要记清楚,这是一个很基础的知识,这里不再赘述。

在线进制转换器

进制转换方法

数据宽度、字节序

数据宽度是指数据在存储器中存储的尺寸

在计算机中,所有数据的基本存储单位都是字节(byte),每个字节占8个位是计算机存储的最小单位,而不是基本单位,因为在存储数据时几乎没有按位进行存储的)。其他的存储单位还有字(word)双字(dword)八字节(qword)

各个存储单元可以表示的数值范围如下:

:上表中给出的数值范围是无符号数。对于有符号数往往是使用第一位表示正负0表示正、1表示负

字节序:即字节顺序。是指一个数在内存单元中各个单元存储的顺序

有以下两种字节序

  • 大尾方式:也叫大端存储。是指数据高位存放在低地址,数据低位存放在高地址。
  • 小尾方式:也叫小端存储。与大尾存储的顺序相反。

0x01020304为例,两种字节序下的存储顺序如下表:

:字节序是以数据宽度为单位的,也就是说我们在根据字节序判断数据时首先要知道此数据的宽度,而后在此宽度大小下进行分析。

:字节序往往容易记混,这个说一下我的记忆方法
内存看作是一条连续的位空间左边是高位右边是低位,此时将数据存储到内存中:大端法就是反向存储小端法就是正向存储,而一个字节的内部是采用小端的思想。

一般在Windows中使用小端存储、在Linux网络传输中使用大端存储

判断字节序的方法

取值比较法

先定义一个4字节十六进制数,而后取其在内存中的低地址字节的数据,根据其值判断即可

注意:这段代码的关键就是*(BYTE*)&dwSmallNum取出来的值。我的想法是通过与运算,获取低地址的八位二进制数。

直接转换比较法

前置知识网络传输中使用大端序+有函数可以将本机数据转换为网络数据

判断方法:将某数据与其转换后数据比较即可判断是否为大端序

常用的字节序转换函数

注意:上图代码有误,应该将判断结果交换。