从C++中的磁盘读取数据
问题描述:
我试图读取位于分区表之外的一些数据,我可以成功读取原始数据,但它似乎以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++的新手。我需要找到一种方法来输出这些数据,以便可以通过脚本读取它。它看起来被不一致的字符分隔。
答
当您打印它时,您将数据解释为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
如果是Windows它更可能是UTF-16比UTF-8。 – 2011-05-25 15:32:12