用户工具

站点工具


侧边栏

06mod教程区:高级技巧:字符串压缩和解压

饥荒的 TheSim:QueryServer() 函数可以向服务器传输数据,使用 TheSim:ZipAndEncodeString() 先对数据进行压缩,可减少传输需要的数据量。

服务器如何解析 TheSim:ZipAndEncodeString() 的返回值呢? 以下是一个 python3 解析示例:

from base64 import b64decode, b64encode
import zlib
import struct
import logging
 
logger = logging.getLogger(__name__)
 
def unzipstring(s):
	''' 解压字符串, 等价于 TheSim:DecodeAndUnzipString() '''
	try:
		return unzipstring_implement(s)
	except Exception as e:
		logger.info("Failed in `unzipstring`: {}".format(e))
		return None
 
def unzipstring_implement(s):
	b = b64decode(s)
	assert len(b) >= 16
	len_str, len_compressed = struct.unpack("<II", b[8:16])
	data = b[16:]
	assert len(data) == len_compressed
	s = zlib.decompress(data)
	assert len(s) == len_str
	return s.decode("utf-8")

可以看出,饥荒在压缩字符串时,是先进行了一次zlib压缩,然后转换为base64格式。 所以,我们在解析的时候,先解析base64,然后进行zlib解压,就能得到原始字符串了。

06mod教程区/高级技巧/字符串压缩和解压.txt · 最后更改: 2022/06/19 19:48 (外部编辑)