2012-11-27 124 views
1

我使用QueryPerformanceCounter();来获取一个数字,作为包含在文件名中的唯一时间戳。将LARGE_INTEGER转换为64位字符串

LARGE_INTEGER performanceCount; 
QueryPerformanceCounter(&performanceCount); 

我需要编码performanceCount.HighPart这是LONG类型和performanceCount.LowPart这是DWORD类型为base64串。然后连接它们并将它们存储在变量wstring中。

我怎样才能做到这一点?

+3

我会怀疑这是否是一个很好的解决方案。这个数字会很大。为什么不使用简单的连续计数器,或者缺少一个GUID? –

+3

你遇到什么困难? Base64转换是一个解决的问题。任何搜索都会找到许多实现。字符串连接也很好理解,因此语言具有内置的功能。 –

+0

分别转换两个数字的建议方法很好,但不是“完美的”(5位/符号输出不映射到64 + 32个输入位);尽管转换“字节数组”可能更容易找到实现。在这方面进行了哪些尝试? – 2012-11-27 22:12:50

回答

1

为避免使用带有文件名(see this question)的base64字符的问题,使用base16的有限字符集可能会更好。即使在32位编译中,MS仍然支持LARGE_INTEGER的QuadPart成员,所以我们正在使用它。

编辑:每个建议征求意见,这样做的主要途径应该使用字符串流:

#include <sstream> 
#include <iomanip> 

std::wstring LargeIntToString(const LARGE_INTEGER& li) 
{ 
    std::wstringstream wss; 
    wss << hex << setw(16) << setfill(L'0') << li.QuadPart; 
    return wss.str(); 
} 


int main() 
{ 
    LARGE_INTEGER li; 
    QueryPerformanceCounter(&li); 

    wcout << LargeIntToString(li) << endl; 
    return 0; 
} 

输出(在我跑了它在我的机器上的时间,反正)

00000041f40cdd33 
+1

只是意识到你想'wstring'。没问题。多一个编辑。 – WhozCraig

+1

他请求base64而不是Hex。如果你故意使用hex而不是base64,请解释答案中的原因。 –

+0

非常感谢Craig!看到移位运算符的实际使用也是非常有用的。 –