C++ 读取硬盘扇区原始数据-为什么是十六进制?

C++ 读取硬盘扇区原始数据-为什么是十六进制?,c++,file-io,hex,C++,File Io,Hex,我试图读取硬盘扇区以获取原始数据。现在在搜索了很多之后,我发现有些人用十六进制存储原始扇区数据,有些用字符存储 哪一个更好,为什么?哪个会给我更好的表现 我试图用C++编写,而OS是Windows。 请澄清- #include <iostream> #include <windows.h> #include <winioctl.h> #include <stdio.h> void main() { DWORD nRead; char buf[5

我试图读取硬盘扇区以获取原始数据。现在在搜索了很多之后,我发现有些人用十六进制存储原始扇区数据,有些用字符存储

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

我试图用C++编写,而OS是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();
}
#包括
#包括
#包括
#包括
void main(){
德沃德·恩雷德;
char-buf[512];
HANDLE hDisk=CreateFile(“\\.\\PhysicalDrive0”,
通用读取、文件共享读取、,
空,打开(存在,0,空);
SetFilePointer(hDisk,0xA00,0,文件开始);
ReadFile(hDisk、buf、512和nRead、NULL);
用于(int currentpos=0;currentpos<512;currentpos++){

std::cout我猜你说的是写入某个文件的最终数据。使用十六进制的原因是因为它更容易读取,也更难搞乱。一般来说,如果有人对该扇区进行某种人类分析,他们无论如何都会对原始数据使用十六进制编辑器,因此如果将其输出为十六进制,则无需使用十六进制编辑器十六进制查看器/编辑器


例如,在DOS/Windows上,如果要使用字符,您必须确保以二进制方式打开文件。此外,您可能还必须确保操作系统不会弄乱字符格式。

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

例如,在DOS/Windows上,如果要使用字符,则必须确保以二进制方式打开文件。此外,还必须确保操作系统不会在两者之间的任何地方弄乱字符格式。

原始数据只是“原始数据”…按原样存储,不进行转换。因此,这里没有性能问题。最多区别在于以人类可读的格式表示原始数据。通常:

  • 如果其中包含一些文本,用char格式表示会更容易理解
  • 而十六进制更适合表示数字数据(以防它遵循某种模式)
在您的特定情况下:char仅表示1字节。因此,您确定您将数据存储在512字节的缓冲区中。按整数大小分配这样的空间会使事情变得不必要的复杂。

原始数据只是“原始数据”…按原样存储,不进行转换。因此,这里没有性能问题。最多区别在于以人类可读的格式表示原始数据。通常:

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

在您的特定情况下:char仅表示1字节。因此,您确信您正在将数据存储在512字节的缓冲区中。按照整数大小分配这样的空间会使事情变得不必要的复杂,您已经弄糊涂了

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

它以十六进制字符格式读取的原因是这样做更容易

decimal: 36
char:    z (potentially one way of representing this value)
hex:     24
binary:  100100
二进制是从磁盘或内存中读取的原始比特流。十六进制就像一种简写的表示法,它们是完全可互换的,一个十六进制“数字”简单地表示四位。同样,十进制只是表示该值的另一种方式

然而,字符有点棘手;对于我的表示,我使用字符0-9来表示值0-9,然后a-z**表示**值10-36。同样,我可以决定使用标准ascii值,它将给我“$”

关于在处理字节时使用“char”的原因,这是因为C++ 'Har’类型只是一个字节(通常是8位)。 我还将指出负数的问题。当你有一个整数,即有符号(有正负)时,第一位(最高有效位)表示一个大的负值,因此如果所有位都是“一”,那么值将表示-1。例如,有四位,因此很容易看到

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


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

你把自己弄糊涂了

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

它以十六进制字符格式读取的原因是这样做更容易

decimal: 36
char:    z (potentially one way of representing this value)
hex:     24
binary:  100100
二进制是从磁盘或内存中读取的原始比特流。十六进制就像一种简写的表示法,它们是完全可互换的,一个十六进制“数字”简单地表示四位。同样,十进制只是表示该值的另一种方式

然而,字符有点棘手;对于我的表示,我使用字符0-9来表示值0-9,然后a-z**表示**值10-36。同样,我可以决定使用标准ascii值,它将给我“$”

关于在处理字节时使用“char”的原因,这是因为C++ 'Har’类型只是一个字节(通常是8位)。 我还将指出负数的问题。当你有一个整数,即有符号(有正负)时,第一位(最高有效位)表示一个大的负值,因此如果所有位都是“一”,那么值将表示-1。例如,有四位,因此很容易看到

001