首页 文章

尝试使用十六进制输入来使用小端和大端

提问于
浏览
0

我试图用这两个原型编写C函数:

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

现在一般的想法是我需要从地址str ofset开始以两种格式返回一个n字节整数 . 附: 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的值 .

谢谢!

2 回答

  • 1

    关于你的代码:return执行它所说的,它从函数返回 . 循环永远不会超过第一个元素 .

    关于问题:检查htonl和ntolh,除了锻炼 .

  • 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 .
    并且可能是速度提升的(取决于编译器优化) .

相关问题