【笔记】Python Struct模块

本文详细介绍了Python中字节顺序(大端、小端)、Struct模块的使用技巧,包括数据格式转换与网络传输处理。此外,还涵盖了原码、反码和补码的基本概念及其在编程中的应用。
部署运行你感兴趣的模型镜像

—计算机中以字节为单位,每个地址对应一个字节,一个字节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称为高地址端。
在这里插入图片描述

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
    在这里插入图片描述
    在这里插入图片描述

例子:

def demo1():
    import struct
    x = struct.unpack('<h', b'\xf0\xff')
    print('struct:', x)
def demo2():
    def hex_to_signed_dec(value):
        return -(value & 0x8000) | (value & 0x7fff)
    x= b'\xf0\xff'
    d1 = int('0xf0', 16)
    d2 = int('0xff', 16)
    d_dec = (d2 << 8) + d1
    print(hex_to_signed_dec(d_dec))
if __name__ == "__main__":
    demo1()   # struct: (-16,)
    demo2()  # -16

三、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而得到的(有进位则进位,但不改变符号位)。

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

总结

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值