#ifndef LICENSEDATA_H #define LICENSEDATA_H #include #include #include /** * @brief 许可证数据结构 V2(极致紧凑版) * * 二进制格式(大端序): * [0..15] 16B 主板UUID(原始二进制) * [16..23] 8B CPU序列号(原始二进制) * [24] 1B 用户名长度N * [25..24+N] N B 用户名UTF-8数据 * [25+N..26+N] 2B 失效日期(距2000-01-01的天数,uint16) * [27+N] 1B 产品号(uint8) * [28+N] 1B 主版本号(uint8) * [29+N] 1B 次版本号(uint8) * [30+N] 1B 激活状态(uint8) * * 总长度 = 31 + N 字节 */ struct LicenseData { QByteArray boardUuid; // 16字节二进制UUID QByteArray cpuSerial; // 8字节二进制 QString userName; // 用户名 QDate expireDate; // 失效日期(仅日期,无时间) quint8 productId; // 产品号 quint8 verMajor; // 主版本号 quint8 verMinor; // 次版本号 quint8 activeState; // 激活状态 LicenseData(); QByteArray toBinary() const; bool fromBinary(const QByteArray &data); QString toDebugString() const; // 辅助转换 static QByteArray uuidStringToBinary(const QString &uuidStr); static QString uuidBinaryToString(const QByteArray &bin); static QByteArray hexStringToBinary(const QString &hexStr); static QString binaryToHexString(const QByteArray &bin); private: // 日期基准:2000-01-01,用uint16存天数,范围 2000-01-01 ~ 2182-06-05 static constexpr int BASE_YEAR = 2000; static constexpr int BASE_MONTH = 1; static constexpr int BASE_DAY = 1; quint16 dateToDays(const QDate &date) const; QDate daysToDate(quint16 days) const; }; #endif // LICENSEDATA_H