繁体   English   中英

在 c 中将大端转换为小端。 警告:从不兼容的指针类型返回 [-Wincompatible-pointer-types] 返回 src;

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

函数convertEndian()的目的是将 big endian 转换为 little endian

警告:从不兼容的指针类型返回 [-Wincompatible-pointer-types] 返回 src;

问题是关于返回类型,其中一个是char **另一个是char *

我需要char **才能交换,但我再次需要返回类型为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]  = '\0';
    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数组的使用是一种惯例,但使赋值的“交换块”在三行中统一对齐; 你完全可以写:

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;
}

无论您使用哪种符号,生成的代码都不可能有任何不同。

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

如果您坚持返回char * ,则将返回类型从void *更改为char * — 不需要其他更改(尽管您可以编写return src;如果您真的想这样做)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM