ccy
8 天以前 2830cce39c0f3e677993bb19c031eb61b43659a3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#ifndef LICENSEDATA_H
#define LICENSEDATA_H
 
#include <QByteArray>
#include <QString>
#include <QDate>
 
/**
 * @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