2013-03-16 51 views
0

我讀了一些十六進制數字,然後我想將它們轉換爲基地2^64。不幸的是,因爲這個數字不能存儲在int中,所以似乎GMP中沒有可以幫助我解決這個問題的函數。基地16基地2^64轉換在GMP

有沒有另一種方法可以做到這一點,我完全失蹤了?

(該程序是在C)

+0

你在做C嗎? – teppic 2013-03-16 22:50:46

+3

基數16與基數2^4相同。你意識到一個2^64的數字只包含16個2^4的數字,對嗎? – Gabe 2013-03-16 22:51:03

+0

是的,我正在C做(可能應該提到這一點)。無論如何,2^64 = 16 * 2^4這個事實是怎麼幫助的? – 2013-03-16 22:59:16

回答

1

在基座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]; 

稍微複雜一些,但仍然很容易實現自動化。

+0

我很欣賞這個解釋(其實很有意思),但我怎樣才能在mpz_get_str中使用這個? – 2013-03-16 23:21:48

+0

我不知道你正在使用的庫的細節,但基本的想法是將你的編號轉換爲一些n的基本2^n(如果可能的話,8將是很好的),然後循環輸出編寫它作爲字節到某個區域的內存,然後讀取該內存。我會在答案中舉個簡單的例子。 – Dave 2013-03-16 23:43:58

+0

'mpz_get_str'與您所要求的相反:它將大數字轉換爲您選擇的任何(小)基數中的一串數字。 – 2015-05-19 05:25:51

0

GMP附帶stdio.h的擴展名,適用於大量數據,請參閱Formatted Input Functions手冊。

在標準輸入(gmp_scanf),文件(gmp_fscanf)或已經讀入內存的字符串(gmp_sscanf)上有通常的口味。