[英]Get notified about the change in raw data in hard disk sector - File change notification
[英]Reading hard disk sector raw data - Why hex?
我正在尝试读取硬盘扇区以获取原始数据。 经过大量搜索,现在我发现有些人将原始扇区数据存储为十六进制,另一些人以char存储。
哪个更好?为什么 ? 哪个能给我更好的表现?
我正在尝试用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();
}
考虑上面的代码是别人而不是我写的。
注意数据类型char buf [512]; 。 将数据类型存储为char并且尚未转换为十六进制。
原始数据只是“原始数据” ...按原样存储它,而不转换。 因此,这里没有性能问题。 最多不同之处在于以人类可读格式表示原始数据。 一般来说:
在您的特定情况下:char仅表示1个字节。 因此,请确保将数据存储在512字节缓冲区中。 按照整数大小分配这样的空间会使事情变得不必要地复杂
你让自己感到困惑。
磁盘上的数据以二进制形式存储,只是一堆长的1和0。
以char格式的十六进制读取它的原因是因为它更容易实现。
decimal: 36
char: z (potentially one way of representing this value)
hex: 24
binary: 100100
二进制文件是您从光盘或内存中读取的原始比特流。 十六进制就像是它的简写形式 ,它们是完全可互换的,一个十六进制的“数字”简单地表示四位。 同样,小数点是表示该值的另一种方式。
字符但是有点棘手。 对于我的表示,我使用字符0-9 表示值0-9,然后az **表示**值10-36。 同样,我本可以决定采用标准ascii值,该值会给我“ $”。
至于为什么在处理字节时使用'char'的原因,是因为C ++的'har'类型只是一个字节(通常为8位)。
我还将指出负数的问题。 当您有一个整数(带正负号)时,第一位(最高有效位)代表一个较大的负值,因此,如果所有位均为“ 1”,则该值代表-1。 例如,只有四位,因此很容易看到...
0010 = +2 1000 = -8 0110 = +6 1110 = -2
解决此问题的关键在于,这仅是您解释/表示二进制值的方式。 相同的位序列可以或多或少以您想要的任何方式表示。
我猜您正在谈论将最终数据写入某个文件。 使用十六进制的原因是因为它更易于阅读,更难以弄乱。 通常,如果某人正在对该部门进行某种人工分析,则无论如何他们都将对原始数据使用十六进制编辑器,因此,如果将其输出为十六进制,则无需使用十六进制查看器/编辑器。
例如,在DOS / Windows上,如果要使用字符,必须确保以二进制格式打开文件。 另外,您可能必须确保操作系统不会在两者之间的任何地方弄乱字符格式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.