我正在尝试读取分区表之外的一些数据,我可以成功读取原始数据,但它似乎是用Unicode(UTF-8)或其他东西编码的.有一个应用程序已经编写来读取这些数据并正确显示它,所以我知道它可以完成.
这个数据被称为“图像安全数据”,这是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,NULL); SetFilePointer(hdisk,0xA00,FILE_BEGIN); ReadFile(hdisk,buf,512,&nRead,NULL); for (int currentpos=0;currentpos < 512;currentpos++) { std::cout << buf[currentpos]; } CloseHandle(hdisk); }
解决方法
当你打印它时,你将数据解释为char.某些值在a-zA-Z“正常,可打印”范围内,因此可以按照您的预期进行打印.像’0’这样的其他人是特殊的,直接无法打印.您可能希望将字节打印为十六进制,而不是字符.要做到这一点:
std::cout << std::hex << std::setw(2) << std::setfill('0') << unsigned(buf[currentpos]) << " ";
这告诉ostream打印两位十六进制数字,如果有更少则使用0,然后强制将char打印为unsigned int.
(如果你有兴趣了解更多关于C你could also use std::copy
and std::ostream_iterator
以避免自己编写循环)