0

生データを取得するためにハードディスクセクターを読み取ろうとしています。多くの検索を行った結果、生のセクター データを 16 進数と 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 として保存され、16 進数に変換されていません。

4

3 に答える 3

2

あなたは混乱しています。

ディスク上のデータは、1と0の長いassストリームであるバイナリとして保存されます。

char形式の16進数で読み取られる理由は、実行が簡単だからです。

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

バイナリは、ディスクまたはメモリから読み取る生のビットストリームです。16進数はその省略表現のようなもので、完全に交換可能です。1つの16進数の「数値」は4ビットを表します。繰り返しますが、小数はその値を表すもう1つの方法です。

ただし、charは少し注意が必要です。私の表現では、0〜9の文字を使用して0〜9の値を表し、azは10〜36の値を**表します**。同様に、「$」が得られる標準のASCII値を使用することもできます。

バイトを処理するときに「char」が使用される理由については、C ++の「har」タイプが1バイト(通常は8ビット)であるためです。

また、負の数の問題についても指摘します。符号付き(正と負)の整数の場合、最初のビット(最上位)は大きな負の値を表し、すべてのビットが「1」の場合、値は-1を表します。たとえば、4ビットで見やすいように...

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

この問題の鍵は、バイナリ値をどのように解釈/表現するかがすべてであるということです。同じビットシーケンスは、多かれ少なかれ好きなように表現できます。

于 2012-10-10T09:28:46.003 に答える
1

最終的なデータが何らかのファイルに書き込まれていることについて話していると思います。16 進数を使用する理由は、読みやすく、混乱しにくいためです。通常、誰かがセクターで何らかの人間の分析を行っている場合、とにかく生データで 16 進エディターを使用するため、16 進として出力する場合は、16 進ビューアー/エディターの必要性をスキップします。

たとえば、DOS/Windows で文字を使用する場合は、ファイルをバイナリとして開く必要があります。また、オペレーティング システムがその間の文字形式を台無しにしないようにする必要がある場合もあります。

于 2012-10-10T08:53:35.713 に答える