2012-07-17 65 views
0

我現在正在學習C語言,並且正在解析原始註冊表文件並閱讀它。如何使用C將char數組更改爲int?

我現在已經有些問題,

000011E0 00 00 00 00 60 01 00 00 B9 01 00 00 00 00 00 00 
000011F0 20 C0 26 00 FF FF FF FF 00 00 00 00 FF FF FF FF 
00001200 10 FC 00 00 FF FF FF FF 4C 00 01 00 00 00 00 00 
this is hex value of REGISTRY file. 

fseek(fp,0x11F0,SEEK_SET); 

char tmp[4]; 
int now = ftell(fp); 
for(int i = 0 ; i < 4 ; i++){ 
    tmp[i] = fgetc(fp); 
    } 

我做了這個TMP數組,但我需要0x0026c020。 如何將此數組更改爲該值?或者請建議我更好的算法。

謝謝。

回答

2

如果您知道該值存儲用相同的字節順序作爲主機操作系統架構的事實,你可以這樣做:

int value = *(int *)tmp; 

但是,你應該讀取向後的順序字節,正如你在這裏所做的那樣 - 改變了字節順序,並且會導致錯誤的值。試試這個:

int value; 
if (fread(&value, sizeof(value), 1, fp) != 1) { 
    /* Could not read, handle error. */ 
} 

/* value is set, inspect it */ 
+0

非常感謝!如果endian不同,怎麼樣? – Nagi 2012-07-17 04:23:50

+1

然後,您需要首先確定兩件事情:數據的字節順序是什麼,以及主機的字節序是什麼?如果一個很大,一個很小,則進行字節交換。標準的4字節交換方式是:'value =((value&0xffu)<< 24)| ((值&0xff00u)<< 8)| ((value&0xff0000u)>> 8)| ((value&0xff000000u)>> 24);' – cdhowie 2012-07-17 04:25:22

+0

或者你不用創建你自己的函數,當你創建數組時,使用網絡函數htonl(),當你讀取數組時,使用ntohl()/這可以保證工作無論endian是否匹配,如果您在網絡訂單/大端系統(不是x86)上都不會執行任何操作。那麼,我猜你不寫這些值,但在閱讀 – 2012-07-17 04:31:57

0

將字符串轉換成整數,已經有可用的功能一個這樣的功能是 strtoul將()。

您可以使用標準strtoul()函數將字符串轉換爲整數值。