【笔记】Python Struct模块

Python 上位交互

  • 一、基础知识
    • 1.高字节和低字节
    • 2. 高地址和低地址
    • 3.大端和小端
  • 二、Struct模块
  • 三、Python decoding
  • 四、原码、反码、补码
  • 总结

—计算机中以字节为单位,每个地址对应一个字节,一个字节8bit。在计算机系统中,如果大于一个字节,就需要区分字节顺序。
大端和小端即网络字节序,顾名思义,当数据在网络上传输时使用什么样的方式排序。常见的字节顺序分为:大端(Big Endian)和小段(Litter Endian)。想要理解什么是大端和小端,首先需要明确下面几个概念

一、基础知识

1.高字节和低字节

在一个n进制中,最左边的位叫最高有效位,最右边的叫最低有效位。
举例说明:
十进制整数:123456789
二进制表示:0000 0111 0101 1011 1100 1101 0001 0101
十六进制表示:07 5B CD 15
按照从右向左的方向,二进制中,0101是低字节、0000是高字节;
十六进制中,15是低字节,07是高字节。

2. 高地址和低地址

在内存中,多字节对象都是被存储为连续的字节序列。假设将int整型在内存中的起始地址(首个字节存储位置)为0x1000,那么另外三个字节就存储在0x1001~0x1003。不管存储的字节顺序是怎样的,内存地址的分配都是从小到大的增长。其中0x1000称为低地址端,0x1003称为高地址端。
【笔记】Python Struct模块_第1张图片

3.大端和小端

大端:高字节存放在低地址,低字节存放在高地址

小端:低字节存放在低地址,高字节存放在高地址

还是以上面的int 123456789为例,十六进制表示: 07 5B CD 15

内存地址(低——>高) 字节存储顺序
大端(Big Endian) 0x1000 0x1001 0x1002 0x1003 0x07 0x5B 0xCD 0x15 高字节存放在低地址,低字节存放在高地址
小端(Litter Endian) 0x1000 0x1001 0x1002 0x1003 0x15 0xCD 0x5B 0x07 低字节存放在低地址高字节存放在高地址

二、Struct模块

用处:
按照指定格式将Python数据转换为字符串,该字符串为字节流,如网络传输时,不能传输int,此时先将int转化为字节流,然后再发送;
按照指定格式将字节流转换为Python指定的数据类型;
处理二进制数据,如果用struct来处理文件的话,需要用’wb’,’rb’以二进制(字节流)写,读的方式来处理文件;
处理c语言中的结构体;

struct 最常用的方法有两个:

  1. struct.pack(fmt,v1,v2,…)
    返回的是一个字符串,是参数按照fmt数据格式组合而成
  2. struct.unpack(fmt,string)
    按照给定数据格式解开(通常都是由struct.pack进行打包)数据,返回值是一个tuple
    【笔记】Python Struct模块_第2张图片
    【笔记】Python Struct模块_第3张图片

例子:

def demo1():
    import struct
    x = struct.unpack('

三、Python decoding

  1. Python decode() 方法以 encoding 指定的编码格式解码字符串。默认编码为字符串编码。
  • str.decode(encoding=‘UTF-8’,errors=‘strict’)
  • encoding – 要使用的编码,如"UTF-8"。
  • errors – 设置不同错误的处理方案。默认为 ‘strict’,意为编码错误引起一个UnicodeError。 其他可能得值有 ‘ignore’, ‘replace’, ‘xmlcharrefreplace’, ‘backslashreplace’ 以及通过 codecs.register_error() 注册的任何值。
    个人注解:常将收到的字节流bytes信息转化为str字符串,方便切分包头包数据。

同理有
2. Python encode() 方法以 encoding 指定的编码格式编码字符串。errors参数可以指定不同的错误处理方案。
str——bytes

     a = bytes.decode(encoding='ISO-8859-1')
     b = str(bytes,encoding='ISO-8859-1')
     a、b等价

encode:编码
decode:解码
python内部编码方式为unicode,decode将其他编码方式转换成unicode编码方式,encode将unicode转换成其他编码方式。
因此unicode相当于一个中转:
(1)decode->unicode->encode
(2)encode->unicode->decode

四、原码、反码、补码

  1. 原码:原码是二进制数字的一种简单的表示法。二进制首位为符号位,1代表负,0代表正。
  2. 反码:反码可由原码得到。如果是正数,反码与原码相同;如果是负数,反码是其原码(符号位除外)各位取反而得到的。
  3. 补码:补码可由原码得到。如果是正数,补码与原码相同;如果是负数,补码是对其原码(除符号位外)各位取反,并在末位加1而得到的(有进位则进位,但不改变符号位)。

通常,整形数在内存中是以 补码 的形式存放的,输出的时候同样也是按照 补码 输出的。

总结

你可能感兴趣的:(Python,python,开发语言)