#!/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的结构)的更多相关文章

  1. 让你的 Qt 桌面程序看上去更加 native(一共六篇)

    <让你的 Qt 桌面程序看上去更加 native>是一个系列文章.在这个系列中,你将会了解到如何让你的 Qt 桌面应用程序看上去更加 native.这里,我假设你已经清楚如何使用 Qt 编 ...

  2. 【python笔记】Qt+云函数 实现简单的登录框制作

    [python笔记]Qt+云函数 实现简单的登录框制作 备注:前置条件:QtDesigner.pycharm.PyQt5.配置好的云函数(百度的叫函数计算CFC,用来充当一个简陋的服务器,主要是免费) ...

  3. java调用python的几种用法(看这篇就够了)

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...

  4. [Python]从豆瓣电影批量获取看过这部电影的用户列表

    前言 由于之后要做一个实验,需要用到大量豆瓣用户的电影数据,因此想到了从豆瓣电影的“看过这部电影 的豆瓣成员”页面上来获取较为活跃的豆瓣电影用户. 链接分析 这是看过"模仿游戏"的 ...

  5. python 语言学入门第一课必看:编码规范

    命名 module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_VAR_NAME, ...

  6. Python笔试、面试 【必看】

    本文由EarlGrey@编程派独家编译,转载请务必注明作者及出处. 原文:Sheena@codementor 译文:编程派 引言 想找一份Python开发工作吗?那你很可能得证明自己知道如何使用Pyt ...

  7. linux python 图形编程 qt开发环境搭建

    我的系统是 ubuntu14.04 我们使用的是python2.7,建议安装qt4+pyqt4+eric4 eric是pyqt的界面设计器的代码生成软件. 1.安装sip 这个是python和qt之间 ...

  8. 传说中Python最难理解的点|看这完篇就够了(装饰器)

    https://mp.weixin.qq.com/s/B6pEZLrayqzJfMtLqiAfpQ 1.什么是装饰器 网上有人是这么评价装饰器的,我觉得写的很有趣,比喻的很形象 每个人都有的内裤主要是 ...

  9. 如何用 Python 做自动化测试【进阶必看】

    一.Selenium 环境部署 1. window 环境部署 1.1 当前环境Win10 64 位系统:Python3.6.2(官方已经更新到了 3.6.4) 官方下载地址:https://www.p ...

随机推荐

  1. nls 字符编码文件对应的国家语言

    原文 http://ftp.twaren.net/cpatch/faq/tech/tech_nlsnt.txt * updated by Kii Ali, 12-11-2001 ftp://ftp.n ...

  2. modal模态框插件

    用法: <!--模态框--> <div class="modal fade" id="myModal"> <div class=& ...

  3. Linux下PortSentry的配置

    Linux下PortSentry的配置       前年写过<IDS与IPS功能分析>一文,受到广大读者关注,现将近期有关IDS配置的文章和大家分享.    Internet上的服务器一般 ...

  4. Vue路由query传参

    1.不要进行过深的嵌套 let id = 'uyu' this.$router.push({ path: '/mrp_detail', query: { re_order_id: id, option ...

  5. 洛谷 P3955 图书管理员【民间数据】

    P3955 图书管理员[民间数据] 题目背景 数据已再次修正 (既然你们不要前导0我就去掉了) 题目描述 图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个 正整数. 每位借书的 ...

  6. Kurento应用开发指南(以Kurento 5.0为模板) 之中的一个:简单介绍,安装与卸载

    文件夹 1. Kurento是什么               3 2. Kurento简单介绍                       3 2.1 WebRTC媒体server         ...

  7. jquery实现转盘抽奖

    jquery实现转盘抽奖 一.总结 一句话总结:这里环形转盘,环形的东西可以化成线性的,然后访问到哪个,给他加上背景为红的样式,用定时器开控制转盘的速度,函数执行的时间间隔越小,就运动的越快. 1.如 ...

  8. Css 显示删除条目效果

    样式设置

  9. mybatis 嵌套查询子查询column传多个参数描述

    https://my.oschina.net/softwarechina/blog/375762

  10. UVA 488 - Triangle Wave 水~

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...