问题描述
|
我正在尝试读取分区表之外的一些数据,我可以成功读取原始数据,但是它似乎是用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);
}
我是C ++的新手。我需要找到一种输出此数据的方法,以便在可能的情况下可由脚本读取。它似乎由不一致的字符分隔。
解决方法
打印时,您会将数据解释为
char
。其中一些值在a-zA-Z \“正常,可打印\”范围内,因此按您的期望进行打印。诸如“ 3”之类的其他字符很特殊,不能直接打印。您可能希望将字节打印为十六进制,而不是字符。要做到这一点:
std::cout << std::hex << std::setw(2) << std::setfill(\'0\') << unsigned(buf[currentpos]) << \" \";
这告诉ѭ5打印十六进制的两位数,如果少则使用0,然后强制将char打印为无符号int。
(如果您想了解有关C ++的更多信息,也可以使用std::copy
和std::ostream_iterator
以避免自己编写循环)