いくつかの16進数を読み取った後、それらを基数2^64に変換したいと思います。残念ながら、この数値はintに格納できないため、GMPにはこの問題の解決に役立つ関数がないようです。
私が完全に欠けているこれを行う別の方法はありますか?
(プログラムはCです)
いくつかの16進数を読み取った後、それらを基数2^64に変換したいと思います。残念ながら、この数値はintに格納できないため、GMPにはこの問題の解決に役立つ関数がないようです。
私が完全に欠けているこれを行う別の方法はありますか?
(プログラムはCです)
基数2^1の10は1010
、2進数の10です。1 0 1 0
基数2^2の10は22
、2進数の10です。10 10
基数2^3の10は12
、2進数の10です。001 010
基数2^4の10はA
、2進数の10です。1010
私があなたに見せようとしている(そして他の人が指摘している)パターンは、それらがすべて同じバイナリ表現を持っているということです。つまり、数値を基数256(char
s)に変換してファイルまたはメモリに書き込むと、基数2 ^ 16(一度に2バイトを読み取る)または基数2 ^ 32(4バイト)で読み取ることができます。一度に)、または実際には2^何でも。これは同じバイナリ表現になります(エンディアンが正しいと仮定します)。したがって、ビッグエンディアンとリトルエンディアンに注意して、として読んでくださいint64_t
。
明確にするために、これは2^nである塩基にのみ適用されます。基数5の10は20
、2進数の10です010 000
。明らかに異なります。ただし、トリナリーを使用する場合、同じ原則が3 ^ nに適用され、ペンタリー(?)では5^nに適用されます。
更新:これをどのように使用できますか:
いくつかの機能付き
void convert(char * myBase16String、uint8_t * outputBase256);
これは、基数16でエンコードされた文字列を取り、符号なし文字の配列を生成すると想定します。各文字は基数256の単位であり、次のようにします。
uint8_t base2_8[8];
convert( "0123456789ABCDEF", base2_8 );
uint64_t base2_64[2];
base2_64[0] = (base2_8[0] << 24) | (base2_8[1] << 16) | (base2_8[2] << 8) | base2_8[3];
base2_64[1] = (base2_8[4] << 24) | (base2_8[5] << 16) | (base2_8[6] << 8) | base2_8[7];
// etc. You can do this in a loop, but make sure you know how long it is.
入力が4バイトの倍数ではなかったとします。
uint8_t base2_8[6];
convert( "0123456789AB", base2_8 );
uint64_t base2_64[2];
base2_64[0] = (base2_8[0] << 8) | base2_8[1];
base2_64[1] = (base2_8[2] << 24) | (base2_8[3] << 16) | (base2_8[4] << 8) | base2_8[5];
少し複雑ですが、自動化はかなり簡単です。
stdio.h
GMPには、多数で機能する拡張機能が付属しています。フォーマットされた入力関数のマニュアルを参照してください。
gmp_scanf
標準の入力( )、ファイル(gmp_fscanf
)、またはすでにメモリに読み込んだ文字列()のいずれかで機能する通常のフレーバーがありますgmp_sscanf
。