Python struct模块和bytes,str,decode,encode
概述
0)encode, decode
print(type(‘struct模块’.encode(‘utf-8’)))
print(type(‘struct模块’.encode(‘gbk’)))
print(type(‘struct模块’.encode(‘gb2312’)))
print(type(str(‘struct模块’.encode(‘gb2312’))))
print(type(‘struct模块’.encode(‘gb2312’).decode(‘gb2312’)))
print(type(‘struct模块’))
<class ‘bytes’>
<class ‘bytes’>
<class ‘bytes’>
<class ‘str’>
<class ‘str’>
<class ‘str’>
aa.encode(a)表示此字符串编码为此码a,
aa.decode(b)表示此字符串采用码b进行解码,b必须是aa的码。
print(type(‘struct模块’.encode(‘gb2312’).decode(‘utf-8’)))是错误的
1)bytes、str
bytes是Python3.x新加的数据类型(在Python2.x中被合并在str)中
2)bytes()
bytes()是Python3的一个内置函数
准确的讲,Python没有提供专门处理字节的数据类型
但由于b’str_obj’可以表示bytes_obj
所以,字节数组 <=> 二进制str
C语言中,我们可以很方便地用struct、union来处理字节,以及字节和int、float的转换
你可以使用位运算把其他数据类型转换为字节类型。
s1 = b’\xf1\xff’
print(int.from_bytes(s1, byteorder=‘big’, signed=False))
print(int.from_bytes(s1, byteorder=‘little’, signed=True))
linux采用 lscpu命令,查看Byte Order 项 。
但是这样不但操作麻烦,而且就上例而言对于浮点数也无能为力
3)struct模块
在Python中,『一切皆对象』,基本数据类型也不列外
C语言的数组int a[3] = {1, 2, 4};,存储的是真正的值
Python的列表lyst = [1, 2, 4],存储的是元素的指针
b = b’abcd’
print(b[0]) #97
print(int(b[0])) # 97
s = ‘abcd’ # 并不代表内存中是按abcd的ascii码存储的!str实际是一个对象而不是一个简单数组
print(int(s[0])) # error 因为str类型的每个元素不是一个简单数字!
这就造成了『列表元素的不连续存储』,在Python中列表中的数据可能不会被存储为连续的字节块
为了处理它们,将python值转换为C结构很重要,即将它们打包成连续的数据字节,或者将一个连续的字节块分解成Python对象
struct模块执行Python值和以Pythonbytes表示的C结构体之间的转换,这可以用于处理存储在文件中或来自网络连接以及其他源的二进制数据;它使用一定格式的字符串作为C语言结构布局的简洁描述以及到或从Python值的预期转换
两个函数:pack()、unpack()
struct模块最重要的两个函数就是pack()、unpack()方法
打包函数:pack(fmt, v1, v2, v3, …)
解包函数:unpack(fmt, buffer)
其中,fmt是格式字符(format的谐音),struct模块支持的格式化字符如下表
例子:
# coding: utf-8
import struct
t ='查'.encode('gb2312')
print(t)
# tt = struct.unpack('s', t)[0]
tt = t.decode('gb2312')
print(str(tt))
"""
b'\xb2\xe9'
查
"""
i = struct.pack('i', 4)
print(i)
ii = struct.unpack('i', i)
print(ii)
"""
b'\x04\x00\x00\x00'
(4,)
"""
s = struct.pack('ii', 4, 4)
print(s)
ss = struct.unpack('ii', s)
print(ss)
"""
b'\x04\x00\x00\x00\x04\x00\x00\x00'
(4, 4)
"""
a = struct.pack('hhl', 1,2,3)
print(a)
b = struct.unpack('hhl', a)
print(b)
"""
b'\x01\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00'
(1, 2, 3)
"""
reference:
https://blog.csdn.net/abc_12366/article/details/80211953
上一篇: 双向链表