仕様が見つからない古いファイル形式 (Cinema4D の古いバージョン) をリバース エンジニアリングしようとしています。
このファイル形式では、float 値が 4 バイトとして格納されていることがわかりましたが、通常の IEEE 形式ではないようです。これはエンディアンの問題ではありません。私は最近、hex<->float 変換ツールを使ってこれを理解するのに多くの時間を費やしました。
いくつかのサンプル値を次に示します。
0 = 00 00 00 00
1 = 80 00 00 41
2 = 80 00 00 42
4 = 80 00 00 43
8 = 80 00 00 44
0.25 = 80 00 00 3F
16384 = 80 00 00 4F
上記の 2 行からの私の観察では、3F から 4F に移動するときに、何かがここでラップしているように見えます。
1.5 = C0 00 00 41
2.5 = A0 00 00 42
-1 = 80 00 00 C1
-1.5 = C0 00 00 C1
-2 = 80 00 00 C2
-3 = C0 00 00 C2
だから、ここにいくつかの観察があります:
- 最後のバイトを +1 増やすと、値が 2 倍になります
- 最後のバイトの上位ビットが設定されている場合、数値は負です
- 最初のバイトは、整数以外の値で何かを行います
明らかなパターンがいくつかあり、指数/仮数が進行していますが、これを理解することはできませんでした。たぶん、明らかな何かが欠けていて、それは通常の IEEE ですか? 仮数/指数などのビット数を把握することは問題ではありません (上記の例では、中間の 2 バイトがゼロです)。まず、浮動小数点値を取得するための式を把握する必要があります。