2012-11-27 113 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!看到移位運算符的實際使用也是非常有用的。 –