用于将任意结构从主机字节顺序转换为网络字节顺序的 C 函数?

标签 c endianness

我创建了一个函数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/

相关文章:

c - 从微 Controller 发送smtp电子邮件

c++ - 为什么多个减量运算符在 C++ 中工作时不能在 C 中工作?

C编程中的编译器错误 "void value not ignored as it ought to be"

Netty 和字节顺序

javascript - 如何在 DataView 中使用 UInt8 处理字节顺序?

c++ - 将 uint16_t 解释为 int16_t

c - 尝试在十六进制输入中使用小端和大端

c - 用于从用户定义的日期时间字符串中提取时间的解析器

c - 将两个矩阵相乘时获取地址作为输出

javascript - 使用 Uint32Array 时我应该关心大端机器吗