c# - 创建匹配的 GUID

标签 c# .net c qt guid

Windows 服务器使用以下字节数组创建 GUID:-

8 146 96 238 162 223 65 74 134 243 14 158 17 155 23 88

用于根据这些字节生成 GUID 的代码是构造函数 Guid(byte[] b) .

这会生成 GUID {ee609208-dfa2-4a41-86f3-0e9e119b1758}

在 Qt 中,客户端使用移植的 .NET source code ,它返回一个 QUuid:-

QUuid GetWindowsGuid(const QByteArray& b)
{
    int _a;
    short _b;
    short _c;
    unsigned char _d, _e, _f, _g, _h, _i, _j, _k;

    _a = ((int)b[3] << 24) | ((int)b[2] << 16) | ((int)b[1] << 8) | b[0];

    _b = (short)(((int)b[5] << 8) | b[4]);
    _c = (short)(((int)b[7] << 8) | b[6]);
    _d = b[8];
    _e = b[9];
    _f = b[10];
    _g = b[11];
    _h = b[12];
    _i = b[13];
    _j = b[14];
    _k = b[15];

    QUuid guid(_a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k);
    return guid;
}

使用相同的 16 个字节,生成一个 UUId,其字符串为:{ffff9208-ffa2-4a41-86f3-0e9e119b1758}

为什么 Uuid 字符串与 Windows GUID 不完全匹配?

最佳答案

我稍微改变了你的代码,现在它可以工作了

QUuid GetWindowsGuid(const QByteArray& b)
{
    uint _a;
    ushort _b;
    ushort _c;
    uchar _d, _e, _f, _g, _h, _i, _j, _k;

    _a = ((uchar)b[3] << 24) | ((uchar)b[2] << 16) | ((uchar)b[1] << 8) | (uchar)b[0];
    _b = (((uchar)b[5] << 8) | (uchar)b[4]);
    _c = (((uchar)b[7] << 8) | (uchar)b[6]);
    _d = b[8];
    _e = b[9];
    _f = b[10];
    _g = b[11];
    _h = b[12];
    _i = b[13];
    _j = b[14];
    _k = b[15];

    QUuid guid(_a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k);
    return guid;
}

关于c# - 创建匹配的 GUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26928167/

相关文章:

c - 它总是第一个坦克

c# - 以编程方式创建 Microsoft Office Outlook 消息

c - 如何设置一个数组等于 char* 方法的返回值

c# - 获取在 C# 中触发 RegNotifyChangeKeyValue 时更改了哪个注册表值

c# - 接口(interface)和只有一个抽象方法的抽象类有什么区别?

c# - C#和Java中继承的区别

c# - Windows Phone 8.1 DatePicker 控件

c# - 计算一个数在某个幂的模数(那个幂的数很大)

c# - 将一个空类作为基类并期望该类将来可能有成员是一种不好的做法吗?

c - (x < 8) 当 x = -3 时返回 false( double )