旅游门户网站建设方案模板,网站流量的重要性,手机响应式网站开发模板之家,网站建设与管理上海交通大学1.背景 之前的标题是【JAVA反序列化QT序列化内容】#xff0c;觉得太大太绕#xff0c;最后改为现在的标题。 本篇内容是对用JAVA解析QT#xff08;用的是QDataSteam#xff09;所输出#xff08;序列化#xff09;的内容的小结。 本文涉及类型包括#xff1a;QString…1.背景 之前的标题是【JAVA反序列化QT序列化内容】觉得太大太绕最后改为现在的标题。 本篇内容是对用JAVA解析QT用的是QDataSteam所输出序列化的内容的小结。 本文涉及类型包括QString、QDateTime。
2. 相关技术 相关技术可以从2个方面阐述QT的序列化和JAVA的文件读取。
2.1QT序列化 QT序列化相关文档Serializing Qt Data Types下面表格中内容是为摘录
Qt Data TypesSerializingQDateJulian day (quint32)QDateTime- Date (QDate)- Time (QTime)- 0 for Qt::LocalTime, 1 for Qt::UTC (quint8)QStringIf the string is null: 0xFFFFFFFF (quint32)Otherwise: The string length in bytes (quint32) followed by the data in UTF-16QTimeMilliseconds since midnight (quint32)
对于相同技术栈的QT序列化和反序列化只需设置适合的QT版本即可。 但对于JAVA就没那么简单了特别是组合类型例如上图中的QDateTime、QString。
QDateTime类型内容分为3个部分固定为9字节日期4字节描述的朱利安天数、时间4字节描述的从0点的毫秒数和时间规格标识1字节。QString类型内容分为2个部分长度为变长字符串长度4字节和数据内容按UTF-16编码。
2.2JAVA的文件读取
2.2.1JAVA读取QString
final long length1 this.fileUtil.readAsDword(fisRaw, isBigEndian, TAG0);
final String title this.fileUtil.readAsStr(fisRaw, (int)length1, utf-16, TAG0);代码中需要关注2点
字节序方法readAsDword的参数isBigEndian即是字符串的编码方法readAsStr的参数utf-16即是
2.2.2JAVA读取QDateTime
// Julian day (quint32)
final long julianDayNumber1 this.fileUtil.readAsDword(fisRaw, isBigEndian, TAG0);
// Milliseconds since midnight (quint32)
final long mss1 this.fileUtil.readAsDword(fisRaw, isBigEndian, TAG0);
// 0 for Qt::LocalTime, 1 for Qt::UTC (quint8)
final int flag1 (255-this.fileUtil.readAsByte(fisRaw, TAG0));Date dt11 this.dtUtil.getDate((int)julianDayNumber1);
Date dt12 this.dtUtil.getTime((int)mss1);代码的核心有2点
按照朱利安按天Julian day转换成公历日期毫秒数转时间
1依据朱利安日数获取公历日期
/** 依据朱利安日数获取公历日期 */
public Date getDate(int jdn) {Calendar cal Calendar.getInstance();cal.set(-4712, 0, 1);cal.add(Calendar.DAY_OF_YEAR, jdn);return cal.getTime();
}对于(-4712, 0, 1)中的参数涉及2点第1是朱利安天的定义第2是JAVA系统对年、月、日的序号的约定。
2依据毫秒数从零点开始计算时间
public Date getTime(int ms) {Calendar cal Calendar.getInstance();cal.set(0, 0, 0, 0, 0, 0);cal.set(Calendar.MILLISECOND, ms);return cal.getTime();
}3. 小结
本文涉及跨技术栈QT JAVA既然是不同的2个系统则存在及较多不一致的约定。 例如QT系统中不存在年数为0但JAVA系统是许可的。年、月、日的序号也不一致。