0

I'm trying to read hard disk sector to get the raw data. Now after searching a lot I found out that some people are storing that raw sector data in hex and some in char .

Which is better, and why ? Which will give me better performance ?

I'm trying to write it in C++ and OS is windows.

For clarification -

#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();
}

Consider the above code written by someone else and not me.

Notice the datatype char buf[512]; . Storing with datatype as char and it hasn't been converted into hex.

4

3 回答 3

2

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

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

在您的特定情况下: char 仅表示 1 个字节。所以你确定你将数据存储在一个 512 字节的缓冲区中。根据整数大小分配这样的空间会使事情变得不必要地复杂

于 2012-10-10T09:07:53.720 回答
2

你把自己弄糊涂了。

磁盘上的数据以二进制形式存储,只是一串由 1 和 0 组成的长流。

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

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

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

然而,char 有点棘手。对于我的表示,我使用字符 0-9 来表示值 0-9,然后 az 是**表示**值 10-36。同样,我本可以决定采用标准的 ascii 值,它会给我'$'。

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

我还将指出负数的问题。当您有一个整数时,即有符号(有正数和负数)第一位(最高有效位)表示一个大的负值,因此如果所有位都是“一”,则该值将表示-1。例如,有四个位,所以很容易看到......

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

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

于 2012-10-10T09:28:46.003 回答
1

我猜你在谈论被写入某个文件的最终数据。使用十六进制的原因是因为它更容易阅读并且更难搞砸。通常,如果有人对该部门进行某种人工分析,他们无论如何都会对原始数据使用十六进制编辑器,因此如果将其输出为十六进制,则无需使用十六进制查看器/编辑器。

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

于 2012-10-10T08:53:35.713 回答