设为首页收藏本站

安徽论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12153|回复: 0

详解python的二进制转化模块

[复制链接]

77

主题

840

回帖

1509

积分

金牌会员

Rank: 6Rank: 6

积分
1509
发表于 2022-3-26 11:02:22 | 显示全部楼层 |阅读模式
网站内容均来自网络,本站只提供信息平台,如有侵权请联系删除,谢谢!
在pyton中,通过
  1. struct
复制代码
模块来对二进制进行转换,主要包括两大类函数,即用于打包的pack和用于解包的unpack。
其中,
  1. struct.pack
复制代码
的输入格式为
  1. struct.pack(format, v1, v2, ...)
复制代码
,其中
  1. format
复制代码
为格式字符串,
  1. v1,v2..
复制代码
为将要转成
  1. bytes
复制代码
的字符。
例如
  1. >>> import struct
  2. >>> struct.pack('i', 15)
  3. b'\x0f\x00\x00\x00'
  4. >>> struct.pack('iii', 15, 16, 17)
  5. b'\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00'
  6. >>> struct.pack('b', 255)   #b格式的取值范围是-128到127
  7. struct.error: byte format requires -128 <= number <= 127
  8. >>> struct.pack('B', 200)
  9. b'\xc8'
  10. >>> struct.pack('B', 71)    #128以内可用ASCII表示
  11. b'G'
复制代码
  1. i
复制代码
代表
  1. int
复制代码
,15对应的二进制代码为
  1. F000
复制代码
,故其输出为
  1. b\x0f\x00\x00\x00
复制代码
。当格式字符串为
  1. iii
复制代码
时,说明要将三个数字以整数类型转化为二进制。
其中,格式化字符串中的每个字符都代表一种数据类型,其中整型相关的字符如下,左侧为带符号整型,右侧为无符号整型
C语言类型 C语言类型标准大小
  1. b
复制代码
signed char
  1. B
复制代码
unsigned char1
  1. h
复制代码
short
  1. H
复制代码
unsigned short2
  1. i
复制代码
int
  1. I
复制代码
unsigned int4
  1. l
复制代码
long
  1. L
复制代码
unsigned long4
  1. q
复制代码
long long
  1. Q
复制代码
unsigned long long8
  1. n
复制代码
ssize_t
  1. N
复制代码
size_t 其他类型
格式C 类型Python 类型标准大小
  1. x
复制代码
填充字节无
  1. c
复制代码
char长度为1的字节串
  1. ?
复制代码
_Boolbool1
  1. e
复制代码
float2
  1. f
复制代码
floatfloat4
  1. d
复制代码
doublefloat8
  1. s
复制代码
char[]字节串
  1. p
复制代码
char[]字节串
  1. P
复制代码
void*整数
  1. struct
复制代码
中提供了获取标准大小的函数,
  1. calcsize
复制代码
:
  1. >>> struct.calcsize('B')
  2. 1
  3. >>> struct.calcsize('i')
  4. 4
复制代码
除了声明被格式化时的数据类型,
  1. struct
复制代码
还可以指定对齐方式,例如
  1. >>> struct.pack("i",15)
  2. b'\x0f\x00\x00\x00'
  3. >>> struct.pack(">i",15)    #小端序
  4. b'\x00\x00\x00\x0f'
  5. >>> struct.pack("<i",15)    #大端序
  6. b'\x0f\x00\x00\x00'
复制代码
其对应字符的含义分别为
  1. @
复制代码
  1. =
复制代码
  1. <
复制代码
  1. >
复制代码
  1. !
复制代码
本机本机小端大端网络(大端)其中默认为
  1. @
复制代码
,即本机字节顺序。
在熟悉了
  1. pack
复制代码
之后,与之对偶的
  1. unpack
复制代码
也就没啥难度了
  1. >>> test = struct.pack("III",125,1255,12555)>>> struct.unpack("III",test)(125, 1255, 12555)
复制代码
除了
  1. pack
复制代码
  1. unpack
复制代码
  1. struct
复制代码
模块还提供了C语言风格的一对函数
  1. pack_into
复制代码
  1. unpack_from
复制代码
,二者的声明分别为
  1. struct.pack_into(format, buffer, offset, v1, v2, ...)
  2. struct.unpack_from(format, /, buffer, offset=0)
复制代码
其中
  1. buffer
复制代码
表示缓冲流,在
  1. pack_into
复制代码
中,将
  1. v1,v2...
复制代码
  1. offset
复制代码
的偏置打包入
  1. buffer
复制代码
中;在
  1. unpack_from
复制代码
中,将
  1. buffer
复制代码
中的数据从
  1. offset
复制代码
处依次取出。
  1. struct
复制代码
中封装了用于二进制处理的类
  1. Struct
复制代码
,按照以往经验,其
  1. pack
复制代码
函数的实现方法很有可能是下面这种
  1. def pack(format,*args):
  2.     return Struct(format).pack(args)
复制代码
其中
  1. Struct
复制代码
的初始化方法就是输入一个格式化字符串,例如
  1. >>> s = struct.Struct("III")>>> s.pack(1,2,3)b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00'
复制代码
总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
                                                        
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
免责声明
1. 本论坛所提供的信息均来自网络,本网站只提供平台服务,所有账号发表的言论与本网站无关。
2. 其他单位或个人在使用、转载或引用本文时,必须事先获得该帖子作者和本人的同意。
3. 本帖部分内容转载自其他媒体,但并不代表本人赞同其观点和对其真实性负责。
4. 如有侵权,请立即联系,本网站将及时删除相关内容。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表