質問
私は現在、ファイル形式の詳細なことを学びたいと思っています。
3Dファイル形式(この場合はU3D)の仕様があり、それを実装しようとします。学習効果のためだけに深刻なことはありません。
私の問題は、定義する必要があるタイプから非常に早く始まります。さまざまな整数(8ビット、16ビット、32ビットの署名と署名)を定義する必要があります。これらをファイルに書き込む前に、これらを16進変換する必要があります。
I16 IEを作成するだけではないため、これらのタイプを定義するにはどうすればよいですか?私にとってもう1つの問題は、I16を8桁の16進数に変換する方法です(つまり0001 0001)。
解決
ヘックスは数字の単なる表現です。数字をバイナリ、小数、16進数、オクタルなどと解釈するかどうかはあなた次第です。 C ++では、小数、16進数、およびオクタル表現をサポートしていますが、それらはすべて同じ方法で保存されています。
例:
int x = 0x1;
int y = 1;
assert(x == y);
ファイル形式では、ファイルを通常のバイナリ形式で保存することを望んでいる可能性があります。ファイル形式は、ヘックス番号を読み取り可能なテキスト文字列として望んでいるとは思わない。しかし、もしそうなら、STD :: hexを使用して変換を行うことができます。 (例: file << hex << number;
)
ファイル形式が1バイトタイプを超えてファイルすることについて書いている場合は、 エンディアンネス あなたのアーキテクチャの。つまり、マルチバイトタイプの最も重要なバイトを最初または最後に保存することを意味します。
ファイル形式の仕様では、バイナリがファイルの特定の部分をどのように探すべきかを示すことは非常に一般的です。実際にバイナリ数字を文字列として保存することでこれを混同しないでください。同様に、HEXでどのように見えるかを指定することで、このショートカットを提供することがあります。繰り返しますが、ほとんどの場合、実際にはテキスト文字列を意味しません。
C ++で最小のアドレス可能なユニットはaです char
これは1バイトです。そのバイト内にビットを設定する場合は、 &
と |
. 。ビットワイズオペレーターには多くのチュートリアルがありますので、ここでは詳しく説明しません。
他のヒント
含める場合 <stdint.h>
次のようなタイプを取得します。
uint8_t
int16_t
uint32_t
まず、理解させてください。整数は、プレフィックス0xなしで、16進形式のファイルにテキストとして保存されますか?
次に、この構文を使用します。
fprintf(fp、 "%08x"、number);
0ABC1234をファイルに書き込みます。
「さまざまな整数を定義する(8ビット、16ビット、32ビット、署名および署名)」については、独自の操作とそれらのために付随する数学操作を除いて、システムが提供するタイプに固執する必要があります。 int32_tなどの利用可能なtypedefsについては、stdint.hを参照してください。