我正在尝试读取硬盘扇区以获取原始数据。现在经过大量搜索,我发现有些人将原始扇区数据存储在十六进制中,一些存储在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并且尚未转换为十六进制。
答案 0 :(得分:2)
原始数据只是“原始数据”...您按原样存储,不进行转换。所以,这里没有性能问题。最多不同之处在于以人类可读格式表示原始数据。一般来说:
在您的特定情况下: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上,如果要使用字符,则必须确保将文件打开为二进制文件。此外,您可能必须确保操作系统不会在其间的任何位置混淆字符格式。