读取硬盘扇区原始数据 - 为什么是hex?

时间:2012-10-10 08:49:57

标签: c++ file-io hex

我正在尝试读取硬盘扇区以获取原始数据。现在经过大量搜索,我发现有些人将原始扇区数据存储在十六进制中,一些存储在char中。

哪个更好,为什么?哪个会给我更好的表现?

我正在尝试用C ++编写,操作系统是Windows。

澄清 -

#include <iostream>
#include <windows.h>
#include <winioctl.h> 
#include <stdio.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);
std::cin.get();
}

考虑上面的代码而不是我写的代码。

注意数据类型char buf [512]; 。以数据类型存储为char并且尚未转换为十六进制。

3 个答案:

答案 0 :(得分:2)

原始数据只是“原始数据”...您按原样存储,不进行转换。所以,这里没有性能问题。最多不同之处在于以人类可读格式表示原始数据。一般来说:

  • 以char格式表示,如果其中包含一些文本,则更容易理解,
  • 而hex更适合表示数字数据(如果它遵循某种模式)。

在您的特定情况下:char只表示1个字节。所以你确定你将数据存储在512字节的缓冲区中。按照整数大小分配这样的空间会让事情变得更加复杂

答案 1 :(得分:2)

你让自己感到困惑。

磁盘上的数据存储为二进制文件,只是一长串的1和0。

以十六进制格式读取char格式的原因是因为它更容易。

decimal: 36
char:    z (potentially one way of representing this value)
hex:     24
binary:  100100

二进制文件是您从光盘或内存中读取的原始位流。 Hex就像是一个简写的表示,它们完全可以互换,一个Hex'数字'简单代表四位。同样,小数只是表示该值的另一​​种方式。

然而,这个小问题有点棘手;对于我的表示,我已经将字符0-9取为表示值0-9,然后a-z是**表示**值10-36。同样,我本可以决定采用标准的ascii值,这将给我'$'。

为什么在处理字节时使用'char',这是因为C ++'har'类型只是一个字节(通常是8位)。

我也会用负数指出问题。当你有一个整数时,它是有符号的(有正负),第一位(最高有效)表示一个大的负值,这样如果所有位都是'1',则该值代表-1。例如,有四位,所以很容易看到......

0010 = +2    1000 = -8    0110 = +6    1110 = -2

这个问题的关键在于你只是如何解释/表示二进制值。可以用你想要的方式或多或少地表示相同的位序列。

答案 2 :(得分:1)

我猜你在谈论写入某个文件的最终数据。使用十六进制的原因是因为它更容易阅读并且更难搞乱。通常,如果某人正在对该扇区进行某种人工分析,他们将在原始数据上使用十六进制编辑器,因此如果您将其输出为十六进制,则不需要十六进制查看器/编辑器。

例如,在DOS / Windows上,如果要使用字符,则必须确保将文件打开为二进制文件。此外,您可能必须确保操作系统不会在其间的任何位置混淆字符格式。