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

问题描述 投票:0回答:1

函数convertEndian()的目的是将大字节序转换为小字节序

警告:从不兼容的指针类型返回[-Wincompatible-pointer-types] return 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;    
}   
c pointers bitmap endianness
1个回答
0
投票

我不确定我是否会费心找出问题代码中正在进行的存储(错误)管理。一种更简单的工作方式是:

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 *-不需要其他更改。

© www.soinside.com 2019 - 2024. All rights reserved.