python implementation for Qt's QDataStream(看一下QDataStream的结构)
#!/usr/bin/env python
# -*- coding: utf- -*-
from __future__ import print_function
from __future__ import unicode_literals
from __future__ import absolute_import
from __future__ import division """
python implemention for QDataStream (Qt 4.0 - Qt 5.6) """ import sys
import struct
import io Qt__ =
Qt__ =
Qt__ =
Qt__ =
Qt__ =
Qt__ =
Qt__ =
Qt__ = Qt__
Qt__ =
Qt__ =
Qt__ =
Qt__ =
Qt__ =
Qt__ = Qt__
Qt__ = Qt__
Qt__ = Qt__
Qt__ =
Qt__ =
Qt__ =
Qt__ = Qt__
Qt__ =
Qt__ = Qt__
Qt__ = SinglePrecision =
DoublePrecision = #懒得支持 Qt 以下的格式了。 class Serializer:
def __init__(self):
self.buffer = io.BytesIO()
self.byte_order = "big"
self.version = Qt__
self.floatingPointPrecision = DoublePrecision def write_char(self, c):
if len(c) != :
raise Exception("write_char() only accept bytes of length .")
self.buffer.write(c) def write_int8(self, i):
self.buffer.write(struct.pack("b", i)) def write_bool(self, b):
self.write_int8( if b else ) def write_uint8(self, i):
self.buffer.write(struct.pack("B", i)) def write_int16(self, i):
pattern = ">h" if self.byte_order == "big" else "<h"
self.buffer.write(struct.pack(pattern, i)) def write_uint16(self, i):
pattern = ">H" if self.byte_order == "big" else "<H"
self.buffer.write(struct.pack(pattern, i)) def write_int32(self, i):
pattern = ">i" if self.byte_order == "big" else "<i"
self.buffer.write(struct.pack(pattern, int(i))) def write_uint32(self, i):
pattern = ">I" if self.byte_order == "big" else "<I"
self.buffer.write(struct.pack(pattern, int(i))) def write_int64(self, i):
pattern = ">q" if self.byte_order == "big" else "<q"
self.buffer.write(struct.pack(pattern, int(i))) def write_uint64(self, i):
pattern = ">Q" if self.byte_order == "big" else "<Q"
self.buffer.write(struct.pack(pattern, int(i))) def write_float(self, f):
if self.version >= Qt__ and self.floatingPointPrecision == DoublePrecision:
self.write_double(f)
else:
pattern = ">f" if self.byte_order == "big" else "<f"
self.buffer.write(struct.pack(pattern, f)) def write_double(self, d):
if self.version >= Qt__ and self.floatingPointPrecision == SinglePrecision:
self.write_float(d)
else:
pattern = ">d" if self.byte_order == "big" else "<d"
self.buffer.write(struct.pack(pattern, d)) def write_bytes(self, bs):
if not bs:
self.write_uint32(0xffffffff)
return
self.write_uint32(len(bs))
self.buffer.write(bs) def write_raw_bytes(self, bs):
self.buffer.write(bs) def write_string(self, s):
if not s:
self.write_bytes(b"")
return
if self.byte_order == "big":
self.write_bytes(s.encode("utf-16be"))
else:
self.write_bytes(s.encode("utf-16le")) def write_map(self, d, key_type_or_func, value_type_or_func):
self.write_uint32(len(d))
for k, v in d.items():
if hasattr(key_type_or_func, "__call__"):
key_type_or_func(self, k)
else:
self.write(key_type_or_func, k)
if hasattr(value_type_or_func, "__call__"):
value_type_or_func(self, v)
else:
self.write(value_type_or_func, v) def write_list(self, l, element_type_or_func):
self.write_uint32(len(l))
if hasattr(element_type_or_func, "__call__"):
for e in l:
element_type_or_func(self, e)
else:
for e in l:
self.write(element_type_or_func, e) def write(self, vt, v):
return {
"int8": self.write_int8,
"uint8": self.write_uint8,
"int16": self.write_int16,
"uint16": self.write_uint16,
"int32": self.write_int32,
"uint32": self.write_uint32,
"int64": self.write_int64,
"uint64": self.write_uint64,
"float": self.write_float,
"double": self.write_double,
"str": self.write_string,
"bytes": self.write_bytes,
"bool": self.write_bool,
}[vt](v) def get_value(self):
return self.buffer.getvalue() class Deserializer:
def __init__(self, buffer):
self.buffer = io.BytesIO(buffer)
self.byte_order = "big"
self.double = False
self.version = Qt__
self.floatingPointPrecision = DoublePrecision def read_int8(self):
i, = struct.unpack("b", self.buffer.read())
return i def read_bool(self):
return bool(self.read_int8()) def read_uint8(self):
i, = struct.unpack("B", self.buffer.read())
return i def read_int16(self):
pattern = ">h" if self.byte_order == "big" else "<h"
i, = struct.unpack(pattern, self.buffer.read())
return i def read_uint16(self):
pattern = ">H" if self.byte_order == "big" else "<H"
i, = struct.unpack(pattern, self.buffer.read())
return i def read_int32(self):
pattern = ">i" if self.byte_order == "big" else "<i"
i, = struct.unpack(pattern, self.buffer.read())
return i def read_uint32(self):
pattern = ">I" if self.byte_order == "big" else "<I"
i, = struct.unpack(pattern, self.buffer.read())
return i def read_int64(self):
pattern = ">q" if self.byte_order == "big" else "<q"
i, = struct.unpack(pattern, self.buffer.read())
return i def read_uint64(self):
pattern = ">Q" if self.byte_order == "big" else "<Q"
i, = struct.unpack(pattern, self.buffer.read())
return i def read_float(self):
if self.version >= Qt__ and self.floatingPointPrecision == DoublePrecision:
return self.read_double()
else:
pattern = ">f" if self.byte_order == "big" else "<f"
f, = struct.unpack(pattern, self.buffer.read())
return f def read_double(self):
if self.version >= Qt__ and self.floatingPointPrecision == SinglePrecision:
return self.read_float()
else:
pattern = ">d" if self.byte_order == "big" else "<d"
d, = struct.unpack(pattern, self.buffer.read())
return d def read_bytes(self):
length = self.read_uint32()
if length == 0xffffffff:
return b""
return self.buffer.read(length) def read_raw_bytes(self, length):
return self.buffer.read(length) def read_string(self):
buf = self.read_bytes()
if self.byte_order == "little":
return buf.decode("utf-16le")
else:
return buf.decode("utf-16be") def read_list(self, element_type_or_func):
length = self.read_uint32()
l = []
if hasattr(element_type_or_func, "__call__"):
for i in range(length):
l.append(element_type_or_func(self))
else:
for i in range(length):
l.append(self.read(element_type_or_func))
return l def read_map(self, key_type_or_func, value_type):
length = self.read_uint32()
d = {}
for i in range(length):
if hasattr(key_type_or_func, "__call__"):
key = key_type_or_func(self)
else:
key = self.read(key_type_or_func)
if hasattr(key_type_or_func, "__call__"):
value = key_type_or_func(self)
else:
value = self.read(value_type)
d[key] = value
return d def read(self, vt):
return {
"int8": self.read_int8,
"uint8": self.read_uint8,
"int16": self.read_int16,
"uint16": self.read_uint16,
"int32": self.read_int32,
"uint32": self.read_uint32,
"int64": self.read_int64,
"uint64": self.read_uint64,
"float": self.read_float,
"double": self.read_double,
"str": self.read_string,
"bytes": self.read_bytes,
"bool": self.read_bool,
}[vt]() if __name__ == "__main__":
try:
from PyQt4.QtCore import QDataStream, QByteArray, QBuffer, QIODevice
except ImportError:
sys.exit() serializer = Serializer()
#serializer.byte_order = "little"
serializer.write_int8()
serializer.write_uint8(0xee)
serializer.write_int16()
serializer.write_uint16(0xffee)
serializer.write_int32(0x100020)
serializer.write_uint32(0xffeeddcc)
serializer.write_int64(0x1000200040)
serializer.write_uint64(0xffeeddccbbaa9988)
serializer.write_float()
serializer.write_bytes(b"fish is here.")
serializer.write_string("实在太帅了。")
h1 = serializer.get_value() buf = QByteArray()
d = QDataStream(buf, QIODevice.WriteOnly)
#d.setByteOrder(QDataStream.LittleEndian)
d.setVersion(QDataStream.Qt__)
d.writeInt8(chr())
d.writeUInt8(chr(0xee))
d.writeInt16()
d.writeUInt16(0xffee)
d.writeInt32(0x100020)
d.writeUInt32(0xffeeddcc)
d.writeInt64(0x1000200040)
d.writeUInt64(0xffeeddccbbaa9988)
d.writeFloat()
d.writeBytes(b"fish is here.")
d.writeQString("实在太帅了。")
h2 = bytes(buf) print(repr(h1))
print(repr(h2))
print(h1 == h2)
python implementation for Qt's QDataStream(看一下QDataStream的结构)的更多相关文章
- 让你的 Qt 桌面程序看上去更加 native(一共六篇)
<让你的 Qt 桌面程序看上去更加 native>是一个系列文章.在这个系列中,你将会了解到如何让你的 Qt 桌面应用程序看上去更加 native.这里,我假设你已经清楚如何使用 Qt 编 ...
- 【python笔记】Qt+云函数 实现简单的登录框制作
[python笔记]Qt+云函数 实现简单的登录框制作 备注:前置条件:QtDesigner.pycharm.PyQt5.配置好的云函数(百度的叫函数计算CFC,用来充当一个简陋的服务器,主要是免费) ...
- java调用python的几种用法(看这篇就够了)
java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...
- [Python]从豆瓣电影批量获取看过这部电影的用户列表
前言 由于之后要做一个实验,需要用到大量豆瓣用户的电影数据,因此想到了从豆瓣电影的“看过这部电影 的豆瓣成员”页面上来获取较为活跃的豆瓣电影用户. 链接分析 这是看过"模仿游戏"的 ...
- python 语言学入门第一课必看:编码规范
命名 module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_VAR_NAME, ...
- Python笔试、面试 【必看】
本文由EarlGrey@编程派独家编译,转载请务必注明作者及出处. 原文:Sheena@codementor 译文:编程派 引言 想找一份Python开发工作吗?那你很可能得证明自己知道如何使用Pyt ...
- linux python 图形编程 qt开发环境搭建
我的系统是 ubuntu14.04 我们使用的是python2.7,建议安装qt4+pyqt4+eric4 eric是pyqt的界面设计器的代码生成软件. 1.安装sip 这个是python和qt之间 ...
- 传说中Python最难理解的点|看这完篇就够了(装饰器)
https://mp.weixin.qq.com/s/B6pEZLrayqzJfMtLqiAfpQ 1.什么是装饰器 网上有人是这么评价装饰器的,我觉得写的很有趣,比喻的很形象 每个人都有的内裤主要是 ...
- 如何用 Python 做自动化测试【进阶必看】
一.Selenium 环境部署 1. window 环境部署 1.1 当前环境Win10 64 位系统:Python3.6.2(官方已经更新到了 3.6.4) 官方下载地址:https://www.p ...
随机推荐
- 保留的 IPv4 地址
保留的IP地址 https://en.wikipedia.org/wiki/Reserved_IP_addresses 地址块(CIDR) 范围 地址数量 范围 目的 0.0.0.0/8 0.0. ...
- js35
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- regular-第一课(正则表达式基础)
之前一直听说正则表达式,尤其是在学习java的时候,遇到了不少关于正则表达式的用法.例如一个输入框,你可以使用正则表达式限制输入的内容.当然,在android以后,正则表达式就几乎没有怎么用了.不过呢 ...
- System and method for critical address space protection in a hypervisor environment
A system and method in one embodiment includes modules for detecting an access attempt to a critical ...
- mysql新加入用户与删除用户详细操作命令
方法1 :使用mysql root(root权限)用户登陆直接赋权也能够创建用户 /usr/bin/mysqladmin -u root password 123456 mysql -uroot -p ...
- 18. springboot整合jsp
转自:https://blog.csdn.net/u012562943/article/details/51836729
- leetcode笔记:Word Break
一. 题目描写叙述 Given a string s and a dictionary of words dict, determine if s can be segmented into a sp ...
- POJ2029:Get Many Persimmon Trees(二维树状数组)
Description Seiji Hayashi had been a professor of the Nisshinkan Samurai School in the domain of Aiz ...
- GCC 编译 --sysroot
-sysroot 的作用 如果在编译时指定了-sysroot就是为编译时指定了逻辑目录.编译过程中需要引用的库,头文件,如果要到/usr/include目录下去找的情况下,则会在前面加上逻辑目录. 如 ...
- Swift语言之View,Button控件实现小方块在界面上的移动(纯代码实现)
import UIKit class ViewController: UIViewController { var diamonds:UIView! var diamondsXY = CGRectMa ...