枚举的htons(),htonl(),ntohs(),ntohl()

时间:2016-05-04 18:29:53

标签: c

我需要在服务器和可能位于不同平台的客户端之间发送一个枚举缓冲区。

但枚举的大小取决于平台,我应该调用哪个函数? (htons() or htonl()),例如以下枚举:

typedef enum f_test_enum{
F0 = 0,
F1 = 1,
F2 = 2,
F3 = 3
} f_test_type;

记住C标准(C99):http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

6.7.2.2枚举说明符

[...]

  

约束条件定义枚举值的表达式   constant应该是一个具有值的整数常量表达式   可表示为int。

[...]

  

每个枚举类型应与char(一个有符号整数)兼容   类型或无符号整数类型。类型的选择是   实现定义,但应能够代表   枚举的所有成员的值。

[EDITED] 如果我的枚举是:

typedef enum n_test_large_enum{
N1 = 0,
N2 = 1,
N2 = 2,
N120000 = 120000
} n_test_large_type;

或者也许:

typedef enum n_test_short_enum{
N0 = 0,
N1 = 1,
N2 = 2,
N60000 = 60000
} n_test_short_type;

当我使用hton *()或ntoh *()时,我应该关注枚举的可能值吗?我可以对所有枚举采取相同的行为吗?

1 个答案:

答案 0 :(得分:3)

只要双方就编码达成一致,只有价值才重要。

因此,只要您的价值适合简短,那么htons()htonl()将起作用,如果双方都保持一致。

如果它确实适合一个字节,只需发送它,使整个字节顺序问题消失。