2014-03-26 44 views
0

我試圖寫這兩個原型C函數:試圖利用小端和大端與十六進制輸入

int extract_little (char* str, int ofset, int n); 
int extract_big(char* str, int ofset, int n); 

現在總的想法是,我需要從開始這兩種格式返回一個字節的整數地址str + ofset。附:奧斯特什麼也沒有做,我計劃(試圖)通過一個偏移量來對內存進行洗牌,一旦我找出那個小端,那個大端。

我試圖讓它像這樣輸出;小端,基於斷i=0xf261a3bf;, 爲0xBF 0xA3執行0x61 0xf2

int main() 
{ 
    int i = 0xf261a3bf; 
    int ofset = 1; // This isn't actually doing anything yet 
    int z; 
    for (z = 0; z < sizeof(i); z++){ 
     printf("%x\n",extract_little((char *)&i,ofset, sizeof(i))); 
    } 
    return 0; 
} 

int extract_little(char *str,int offs, int n) { 
    int x; 
    for (x = 0; x < n; x++){ 
     return str[x]; 
    } 
} 

的我不知道什麼嘗試。我想通了很難的方式,甚至認爲我把它放在for循環中,我仍然不能從返回中返回超過1的值。

謝謝!

+0

累積循環內的返回值,然後在最後返回。 – Useless

+0

我該如何去積累一個數組? – bonkerz11

+0

一個SSCCE和一個例子會有所幫助。例如,對於給定的代碼,'extract_little()'總是會返回'str [0]'。 http://www.sscce.org/ – Arun

回答

1
unsigned long extract_little(const void *p, size_t offset, unsigned char n) { 
    unsigned long ret = 0; 
    for(size_t i = offset + n - 1; i >= offset; i--) 
     ret = (ret<<8) + ((char *)p)[i]; 
    return ret; 
} 
unsigned long extract_big(const void *p, size_t offset, unsigned char n) { 
    unsigned long ret = 0; 
    for(size_t i = offset; i < (offset + n); i++) 
     ret = (ret<<8) + ((char *)p)[i]; 
    return ret; 
} 

int main() 
{ 
    int i = 0xf261a3bf; 
    printf("%x\n", extract_little(&i, 0, sizeof(i))); 
    return 0; 
} 

工作(當然)只適用於最大的sizeof(無符號長)n。
可能會提高速度,可能(取決於編譯器優化)。

+0

我只是檢查了一下,我很難理解size_t是什麼/爲什麼我的編譯器不喜歡它。 – bonkerz11

+0

size_t是用於大小的整數類型 - 您現在可以堅持使用int。 – Useless

1

關於你的代碼:return做了它所說的,它從函數返回。循環永遠不會運行超過第一個元素。

關於問題:檢查htonl和ntolh,除了鍛鍊。