在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 char
、unsigned char
、int8_t
或 uint8_t
都可以代替使用基本上没有区别。我忽略了 CHAR_BITS > 8
的可能性;如果这对您来说是个问题,则需要重新考虑。如果你使用 return src;
并且 src
的类型与函数的 return 类型不匹配,那么你必须转换它,或者恢复为 return source;
.
函数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 char
、unsigned char
、int8_t
或 uint8_t
都可以代替使用基本上没有区别。我忽略了 CHAR_BITS > 8
的可能性;如果这对您来说是个问题,则需要重新考虑。如果你使用 return src;
并且 src
的类型与函数的 return 类型不匹配,那么你必须转换它,或者恢复为 return source;
.