打印GUID变量

Jen*_*eni 37 c++ guid

我有一个GUID变量,我想在文本文件中写入其值.GUID定义是:

typedef struct _GUID {          // size is 16
    DWORD Data1;
    WORD   Data2;
    WORD   Data3;
    BYTE  Data4[8];
} GUID;
Run Code Online (Sandbox Code Playgroud)

但我想写下它的价值:

CA04046D-0000-0000-0000-504944564944
Run Code Online (Sandbox Code Playgroud)

我观察到:

  • Data1 保存CA04046D的十进制值
  • Data2 保持0的十进制值
  • Data3 保存下一个0的十进制值

但其他人呢?

我必须解释自己这个值才能得到那个输出,或者有更直接的方法来打印这样的变量?

Jus*_*inB 48

有时候滚动你自己很有用.我喜欢fdioff的回答,但不太对劲.有11个不同大小的元素.

printf("Guid = {%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX}", 
  guid.Data1, guid.Data2, guid.Data3, 
  guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
  guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);

Output: "Guid = {44332211-1234-ABCD-EFEF-001122334455}"
Run Code Online (Sandbox Code Playgroud)

有关GUID布局,请参阅Guiddef.h.

同样,作为一种方法:

void printf_guid(GUID guid) {
    printf("Guid = {%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX}", 
      guid.Data1, guid.Data2, guid.Data3, 
      guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
      guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
}
Run Code Online (Sandbox Code Playgroud)

您也可以将CLSID传递给此方法.


Joh*_*bly 46

使用StringFromCLSID函数将其转换为字符串

例如:

GUID guid;
CoCreateGuid(&guid);

OLECHAR* guidString;
StringFromCLSID(guid, &guidString);

// use guidString...

// ensure memory is freed
::CoTaskMemFree(guidString);
Run Code Online (Sandbox Code Playgroud)

另请参阅有关data4描述的GUIDMSDN定义, data4是包含GUID的最后8​​个字节的数组

  • StringFromGUID2()可用于避免分配,它将其结果放在调用者指定的缓冲区中.这避免了失败的可能性以及释放结果的必要性. (4认同)

Ros*_*ost 11

在当你的代码使用ATL情况/ MFC你也可以使用CComBSTR::CComBSTR(REFGUID guid)来自atlbase.h:

GUID guid = ...;
const CComBSTR guidBstr(guid);  // Converts from binary GUID to BSTR
const CString guidStr(guidBstr); // Converts from BSTR to appropriate string, ANSI or Wide
Run Code Online (Sandbox Code Playgroud)

它将自动进行转换和内存清理.


Yur*_*sov 11

如果您更喜欢C++方式

std::ostream& operator<<(std::ostream& os, REFGUID guid){

    os << std::uppercase;
    os.width(8);
    os << std::hex << guid.Data1 << '-';

    os.width(4);
    os << std::hex << guid.Data2 << '-';

    os.width(4);
    os << std::hex << guid.Data3 << '-';

    os.width(2);
    os << std::hex
        << static_cast<short>(guid.Data4[0])
        << static_cast<short>(guid.Data4[1])
        << '-'
        << static_cast<short>(guid.Data4[2])
        << static_cast<short>(guid.Data4[3])
        << static_cast<short>(guid.Data4[4])
        << static_cast<short>(guid.Data4[5])
        << static_cast<short>(guid.Data4[6])
        << static_cast<short>(guid.Data4[7]);
    os << std::nouppercase;
    return os;
}
Run Code Online (Sandbox Code Playgroud)

用法:

static const GUID guid = 
{ 0xf54f83c5, 0x9724, 0x41ba, { 0xbb, 0xdb, 0x69, 0x26, 0xf7, 0xbd, 0x68, 0x13 } };

std::cout << guid << std::endl;
Run Code Online (Sandbox Code Playgroud)

输出:

F54F83C5-9724-41BA-BBDB-6926F7BD6813

  • 你需要在开始时使用os.fill('0'),并且需要为Data4的每个字节重复宽度. (2认同)

Tim*_*wty 7

您可以使用StringFromGUID2()消除对特殊字符串分配/解除分配的需要

GUID guid = <some-guid>;
// note that OLECHAR is a typedef'd wchar_t
wchar_t szGUID[64] = {0};
StringFromGUID2(&guid, szGUID, 64);
Run Code Online (Sandbox Code Playgroud)

  • 那么,使用StringFromGUID2()的优点是您不必执行任何COM或BSTR字符串释放.你传递它简单的'内存,它在那里写字符.OLECHAR只是一个typedef'd wchar_t. (2认同)

Mar*_* M. 6

Google的breakpad项目提供:

std::string ToString(GUID *guid) {
    char guid_string[37]; // 32 hex chars + 4 hyphens + null terminator
    snprintf(
          guid_string, sizeof(guid_string),
          "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
          guid->Data1, guid->Data2, guid->Data3,
          guid->Data4[0], guid->Data4[1], guid->Data4[2],
          guid->Data4[3], guid->Data4[4], guid->Data4[5],
          guid->Data4[6], guid->Data4[7]);
    return guid_string;
}

UUID guid = {0};
UuidCreate(&guid);
std::cout << GUIDToString(&guid);
Run Code Online (Sandbox Code Playgroud)


ste*_*eve 6

JustinB的回答启发

#define GUID_FORMAT "%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX"
#define GUID_ARG(guid) guid.Data1, guid.Data2, guid.Data3, guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]
Run Code Online (Sandbox Code Playgroud)

然后

printf("Int = %d, string = %s, GUID = {" GUID_FORMAT "}\n", myInt, myString, GUID_ARG(myGuid));
Run Code Online (Sandbox Code Playgroud)