我创建了一个函数my_hton()
将主机字节顺序的数据转换为网络字节顺序。它转换任何任意结构的对象。如果正确的话,为什么C有类似htons()
这样的函数和htonl()
它分别只转换 2 和 4 个字节,而不是为所有数据类型提供一个函数,还是我遗漏了一些东西?
void my_hton(char *buffer, char *p, size_t i){
if( is_little_endian() ){
while(i > 0){
*buffer = p[i-1];
buffer++;
i--;
}
}
}
struct demo{
int a;
char b;
char str[100];
float f;
double d;
int *ptr;
};
int main() {
char buffer[10000] = "";
struct demo object;
/*
* object initialization
*/
my_hton(buffer, (char*) &object, sizeof(object));
return 0;
}
最佳答案
您在代码中所做的操作是按字节翻转整个结构,这会导致您的各个成员出现乱码。
更好的问题是为什么要转换整个结构的字节序?
更改单个整数类型字段的字节序是有意义的,但这需要有关字段的信息,因此您不能拥有通用函数。
另一方面,如果您的结构具有固定大小的元素且填充相等,那么您可以编写一个通用函数来转换每个字段的字节序。但我相信大多数为网络制作的结构都是打包的,这种情况非常罕见。
关于用于将任意结构从主机字节顺序转换为网络字节顺序的 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44627731/