我讀了一些十六進制數字,然後我想將它們轉換爲基地2^64。不幸的是,因爲這個數字不能存儲在int中,所以似乎GMP中沒有可以幫助我解決這個問題的函數。基地16基地2^64轉換在GMP
有沒有另一種方法可以做到這一點,我完全失蹤了?
(該程序是在C)
我讀了一些十六進制數字,然後我想將它們轉換爲基地2^64。不幸的是,因爲這個數字不能存儲在int中,所以似乎GMP中沒有可以幫助我解決這個問題的函數。基地16基地2^64轉換在GMP
有沒有另一種方法可以做到這一點,我完全失蹤了?
(該程序是在C)
在基座2 10^1是1010
這在二進制是1 0 1 0
10在基體2^2是22
這在二進制是10 10
10在基體2^3是12
這在二進制是001 010
在基座2 10^4 A
這在二進制是1010
我試圖告訴你(和其他人已經注意到)的模式是它們都具有相同的二進制表示形式。換句話說,如果您將您的號碼轉換爲256(char
s)並將其寫入文件或內存,則可以以2^16(每次讀取2個字節)或2^32(4字節在一次),或者實際上2 ^任何東西。這將是相同的二進制表示(假設你的endians正確)。所以要注意大碼和小碼,並且請注意int64_t
。
要清楚的是,這隻適用於2^n的鹼基。基數5中的10是20
,其在二進制中是010 000
;明顯不同。但是如果你使用trinary,同樣的原則適用於3^n,而在五元組(?)它適用於5^n。
更新:你怎麼可以這樣做:
隨着一些功能
無效轉換(字符* myBase16String,uint8_t * outputBase256);
我們假設需要在基座16編碼的字符串,併產生無符號字符數組,其中每個字符爲單位在基座256中,我們這樣做:
uint8_t base2_8[8];
convert("ABCDEF", 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("AB", 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];
稍微複雜一些,但仍然很容易實現自動化。
我很欣賞這個解釋(其實很有意思),但我怎樣才能在mpz_get_str中使用這個? – 2013-03-16 23:21:48
我不知道你正在使用的庫的細節,但基本的想法是將你的編號轉換爲一些n的基本2^n(如果可能的話,8將是很好的),然後循環輸出編寫它作爲字節到某個區域的內存,然後讀取該內存。我會在答案中舉個簡單的例子。 – Dave 2013-03-16 23:43:58
'mpz_get_str'與您所要求的相反:它將大數字轉換爲您選擇的任何(小)基數中的一串數字。 – 2015-05-19 05:25:51
GMP附帶stdio.h
的擴展名,適用於大量數據,請參閱Formatted Input Functions手冊。
在標準輸入(gmp_scanf
),文件(gmp_fscanf
)或已經讀入內存的字符串(gmp_sscanf
)上有通常的口味。
你在做C嗎? – teppic 2013-03-16 22:50:46
基數16與基數2^4相同。你意識到一個2^64的數字只包含16個2^4的數字,對嗎? – Gabe 2013-03-16 22:51:03
是的,我正在C做(可能應該提到這一點)。無論如何,2^64 = 16 * 2^4這個事實是怎麼幫助的? – 2013-03-16 22:59:16