2011-05-25 143 views
4

我試圖讀取位於分區表之外的一些數據,我可以成功讀取原始數據,但它似乎以Unicode(UTF-8)或其他東西編碼。有一個應用程序已被寫入讀取這些數據並正確顯示,所以我知道它可以完成。從C++中的磁盤讀取數據

此數據被稱爲「圖像安全數據」,它是Novell ZenWorks在第六個扇區(0x05)放置在磁盤上的東西。

的原始數據是這樣的:

ZISD♂ Æ☻  ☺ └¿ ├└¿ ☺ ñ3åG ╓ï╝Y ≡ ♣ § ╗ç9%¥⌂+0Kâ¬ê 


    :☺    @ f 8 b 3 4 6 6 2 9 3 b 3 2 b b f d c 8 c b d 6 2 2 1 2 1 0 d 
2 1 ♫ M H S T R E E ▬ F H I F L 0 0 0 5 9 3  L \ \ F H 0 1 F S N T H 0 
9 \ A P P S \ i m g s \ C X P P N 6 7 1 0 B . z m g $ t r i n i t y - h e a l 
t h . o r g ▬ F H I F L 0 0 0 5 9 3 H Z N W 

我寫了下面的代碼從磁盤用C直接讀取數據++:

#include <iostream> 
#include <windows.h> 


void main() { 
    DWORD nRead; 
    char buf[512]; 

    HANDLE hDisk = CreateFile("\\\\.\\PhysicalDrive0", 
     GENERIC_READ, FILE_SHARE_READ,   
     NULL, OPEN_EXISTING, 0, NULL); 

    SetFilePointer(hDisk, 0xA00, 0, FILE_BEGIN); 
    ReadFile(hDisk, buf, 512, &nRead, NULL); 
    for (int currentpos=0;currentpos < 512;currentpos++) { 
     std::cout << buf[currentpos]; 
    } 
    CloseHandle(hDisk); 
} 

我在C++的新手。我需要找到一種方法來輸出這些數據,以便可以通過腳本讀取它。它看起來被不一致的字符分隔。

+1

如果是Windows它更可能是UTF-16比UTF-8。 – 2011-05-25 15:32:12

回答

2

當您打印它時,您將數據解釋爲char。其中一些值位於a-zA-Z「正常,可打印」範圍內,因此按照您的預期進行打印。其他人,如'0'是特殊和不可打印的直接。您可能希望以十六進制打印字節,而不是字符。要做到這一點:

std::cout << std::hex << std::setw(2) << std::setfill('0') << unsigned(buf[currentpos]) << " "; 

這告訴ostream打印十六進制的兩位數字,使用0,如果有少,然後強制將打印爲unsigned int類型的字符。

(如果你有興趣瞭解更多關於C++你could also use std::copy and std::ostream_iterator避免編寫循環自己)

+0

只是一個問題,但他可能會想要在那裏的某些分隔符:-)。 – 2011-05-25 15:43:40