2014-10-20 101 views
0

我正在使用Mini Ini從嵌入式系統上的.ini文件中讀取數據。它支持長整數或字符串閱讀。我擁有的一些數字太大而不適合長時間,所以我正在以字符串的形式閱讀它們。不過,我需要將它們轉換爲uint64_t。如何將ASCII碼轉換爲uint64?

我試圖將其轉換爲使用atof的浮點數並將其轉換爲uint64_t,該uint64_t崩潰並燒燬,這可能是因爲cast會更改程序如何查看這些位而不更改位本身。

char string_in[100]; 
//ret = ini_gets(section,key,"default_value",string_in,100,inifile); 
//To simplify, use 
string_in = "5100200300"; 
uint64_t value = (uint64_t)atof(string_in); 

我將不勝感激關於如何將字符串轉換爲uint64的幫助。

編輯:結論

atoll功能轉換ASCII到很長很長,供應我所需要的目的。然而,爲了完整起見,我實現了接受答案中提供的功能,併爲我的問題提供了確切的答案。

+0

浮動不是一個uint64_t中......夠大(BTW鑄造將執行截斷,但它適用於這一顯式轉換)。 – 2014-10-20 13:52:54

+1

環礁()是我所需要的。謝謝,我感到愚蠢,但谷歌背叛了我,所以...... – Trogdor 2014-10-20 14:00:45

+0

'strtoull()'提供比'atoll'更多的錯誤檢查。 – chux 2014-10-20 14:31:12

回答

2

你可以寫自己的轉換功能:

uint64_t convert(const char *text) 
{ 
    uint64_t number=0; 

    for(; *text; text++) 
    { 
     char digit=*text-'0';   
     number=(number*10)+digit; 
    } 

    return number; 
} 
+0

感謝您的答案,看起來像它會工作(作爲@ shuttle87的建議),但環礁是足夠的。儘管 – Trogdor 2014-10-20 14:04:23

+0

爲什麼你選擇使用const char *作爲輸入而不是char *? – Trogdor 2014-10-20 14:06:33

+1

@Trogdor顯然是因爲函數不會改變'text'?這樣的指針參數應該總是*爲'const'。 – unwind 2014-10-20 14:21:56

0
#include <stdint.h> 
#include <stdlib.h> 
#include <assert.h> 

static_assert(sizeof(uint64_t) == sizeof(long long), 
       "Your system is mighty weird"); 

uint64_t u64 = strtoull(string, NULL, 10);