0

いくつかの16進数を読み取った後、それらを基数2^64に変換したいと思います。残念ながら、この数値はintに格納できないため、GMPにはこの問題の解決に役立つ関数がないようです。

私が完全に欠けているこれを行う別の方法はありますか?

(プログラムはCです)

4

2 に答える 2

1

基数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(chars)に変換してファイルまたはメモリに書き込むと、基数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];

少し複雑ですが、自動化はかなり簡単です。

于 2013-03-16T23:09:46.980 に答える
0

stdio.hGMPには、多数で機能する拡張機能が付属しています。フォーマットされた入力関数のマニュアルを参照してください。

gmp_scanf標準の入力( )、ファイル(gmp_fscanf)、またはすでにメモリに読み込んだ文字列()のいずれかで機能する通常のフレーバーがありますgmp_sscanf

于 2015-05-19T05:23:38.753 に答える