在c中将Big endian转换为little endian。 warning:return 来自不兼容的指针类型 [-Wincompatible-pointer-types] return src;

converting Big endian to little endian in c. warning:return from incompatible pointer type [-Wincompatible-pointer-types] return src;

函数convertEndian()的目的是将大端转换为小端

warning:return from incompatible pointer type [-Wincompatible-pointer-types] return src;

问题是关于 return 类型,其中一种是 char ** 另一种是 char *

我需要 char ** 才能交换,但我又需要 return 输入 char *。那你有什么建议吗?

char *convertEndian(void *source)
{
    typedef unsigned char EightBytes[8];

    unsigned char temp;
    //  char **src = (char **)malloc(1000 * sizeof(char *));
    //  char *temp = (char *)malloc(1000 * sizeof(char));

    EightBytes *src = (EightBytes *)source;
    temp = (*src)[0];
    (*src)[0] = (*src)[7];
    (*src)[7] = temp;

    temp = (*src)[1];
    (*src)[1] = (*src)[6];
    (*src)[6] = temp;

    temp = (*src)[2];
    (*src)[2] = (*src)[5];
    (*src)[5] = temp;

    temp = (*src)[3];
    (*src)[3] = (*src)[4];
    (*src)[4] = temp;

    return src;  //shows warning for this part
}

//convertEndian function will be used inside this function
int getHeaderSize(unsigned char * header)
{
    char * headerSize = (char *)malloc(9 * sizeof(char));
    for (int i = 0; i < 8; i += 2)
    {
        headerSize[i] = header[i + 20];
        headerSize[i + 1] = header[i + 21];
    }
    headerSize[8]  = '[=12=]';
    headerSize = convertEndian(headerSize);
    int size = hex2int(headerSize);
    return size;    
}   

我不确定我是否愿意弄清楚问题代码中正在进行的存储(错误)管理。一种更简单的完成这项工作的方法是:

extern void *convertEndian(void *source);

void *convertEndian(void *source)
{
    char *src = source;

    for (int i = 0, j = 7; i < j; i++, j--)
    {
        char tmp[1];
        tmp[0] = src[i];
        src[i] = src[j];
        src[j] = tmp[0];
    }
    return source;
}

使用数组 tmp 是一种常规做法,但会使 'swap block' 赋值统一对齐三行;你完全可以这样写:

extern void *convertEndian(void *source);

void *convertEndian(void *source)
{
    char *src = source;

    for (int i = 0, j = 7; i < j; i++, j--)
    {
        char tmp = src[i];
        src[i] = src[j];
        src[j] = tmp;
    }
    return source;
}

生成的代码不太可能与您使用的任何表示法有任何不同。

如果您希望手动展开循环而不是依赖编译器进行优化,那是您的特权。

如果您坚持 returning char *,则将 return 类型从 void * 更改为 char * — 不需要其他更改(不过如果你真的想写 return src; 也可以。

您可以使用任何 8 位整数类型代替 char — 因此 signed charunsigned charint8_tuint8_t 都可以代替使用基本上没有区别。我忽略了 CHAR_BITS > 8 的可能性;如果这对您来说是个问题,则需要重新考虑。如果你使用 return src; 并且 src 的类型与函数的 return 类型不匹配,那么你必须转换它,或者恢复为 return source;.