2014-03-26 16 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,除了锻炼。