用c++从磁盘读取数据

Read data from a disk in c++

本文关键字:读取 数据 磁盘 c++      更新时间:2023-10-16

我正在尝试读取分区表之外的一些数据,我可以成功读取原始数据,但它似乎是用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, 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,然后强制将字符打印为无符号整数。

(如果您有兴趣了解更多关于C++的信息,也可以使用std::copystd::ostream_iterator来避免自己编写循环)