C++ 读取硬盘扇区原始数据-为什么是十六进制?
我试图读取硬盘扇区以获取原始数据。现在在搜索了很多之后,我发现有些人用十六进制存储原始扇区数据,有些用字符存储 哪一个更好,为什么?哪个会给我更好的表现 我试图用C++编写,而OS是Windows。 请澄清-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
#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