Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

1.8. 序列化

1.8.1. struct C 语言结构体序列化

1.8.1.1. 端序

不同的场景使用不同的端序方案,不同的方案是不同历史时期,计算机厂商指定标准。

			
import struct
print("原生",struct.pack('@h', 1023))
print("标准",struct.pack('=h', 1023))
print("小端",struct.pack('<h', 1023))
print("大端",struct.pack('>h', 1023))
print("网络",struct.pack('!h', 1023))			
			
			

输出结果

			
原生 b'\xff\x03'
标准 b'\xff\x03'
小端 b'\xff\x03'
大端 b'\x03\xff'
网络 b'\x03\xff'			
			
			

1.8.1.2. Struct 类

			
import struct

format = '!HHH'
audio = struct.Struct(format)
print(f"{audio.size}")

encode = audio.pack(2,2000,65535)
print(f"{len(encode)}: {encode}")		
			
			

输出结果

			
6
6: b'\x00\x02\x07\xd0\xff\xff'		
			
			

1.8.1.3. char 与 signed char / unsigned char 的区别

char 存储的是字符,signed char / unsigned char 存储的是有符号和无符号整数,相当于 int(1) 长度,当我们需要标准大小为1的时候可以使用 signed char / unsigned char

			
import struct

data = struct.pack('c', b"A")
print(f"{len(data)},{data}")  # 输出 1 字节

c = struct.unpack('c', data)
print(c)


# 打包一个 1 字节无符号整数 0~255
data = struct.pack('!B', 120)
print(f"{len(data)},{data}")  # 输出 1 字节

num = struct.unpack('!B', data)
print(num)			
			
			

输出结果

			
1,b'A'
(b'A',)

1,b'x'
(120,)	
			
			

1.8.2. shelve(序列化)

		 
import shelve

with shelve.open("/var/tmp/test") as db:
	db["hello"] = "helloworld"

with shelve.open("/var/tmp/test") as db:
	for k, v in db.items():
		print(k, ":", v)		
		
		
		 
import shelve, json

data = json.loads(json.dumps({"800": "AAAA", "900": "BBBB", "1000": "CCCC"}))
print(data, type(data))
with shelve.open("/var/tmp/test", "n") as db:
	for k, v in data.items():
		db[k] = v

with shelve.open("/var/tmp/test") as db:
	for k, v in db.items():
		print(k, ":", v)