C++ 不使用网络相关头的htonl

C++ 不使用网络相关头的htonl,c++,c,networking,C++,C,Networking,我们正在编写嵌入式应用程序代码,并验证有效IPv4格式的字符串。我可以使用字符串标记器成功地实现这一点,但现在我需要使用htonl()函数将整数转换为主机到网络的顺序 由于它是一个嵌入式应用程序,我不能仅仅为了使用htonl()函数而包含网络头和库 在C++中有任何方式/非网络标头,我可以利用HtONLL()函数从 < /P> < P> 函数的作用是:将无符号整数hostlong从主机字节顺序转换为网络字节顺序 实际上只是大端的 您只需编写(或查找)一个函数,将无符号整数转换为big-endia

我们正在编写嵌入式应用程序代码,并验证有效IPv4格式的字符串。我可以使用字符串标记器成功地实现这一点,但现在我需要使用htonl()函数将整数转换为主机到网络的顺序

由于它是一个嵌入式应用程序,我不能仅仅为了使用htonl()函数而包含网络头和库

在C++中有任何方式/非网络标头,我可以利用HtONLL()函数从 < /P> < P> 函数的作用是:将无符号整数hostlong从主机字节顺序转换为网络字节顺序

实际上只是大端的

您只需编写(或查找)一个函数,将无符号整数转换为big-endian,并用它代替
htonl
。如果您的系统已经在big endian中,那么您根本不需要做任何事情


您可以使用以下各项来确定系统的端点:

int n = 1;
// little endian if true
if(*(char *)&n == 1) {...}


您可以使用以下命令将一个小的尾数单位
uint32\u t
转换为大尾数单位:

uint32_t htonl(uint32_t x) {
    unsigned char *s = (unsigned char *)&x;
    return (uint32_t)(s[0] << 24 | s[1] << 16 | s[2] << 8 | s[3]);
}
uint32\u t htonl(uint32\u t x){
无符号字符*s=(无符号字符*)&x;

return(uint32_t)(s[0]您不需要严格的htonl。如果您的IP地址是单独的字节,如下所示:

uint8_t a [4] = { 192, 168, 2, 1 };
uint32_t ip = getIPHostOrder();
uint8_t a [4] = { (ip >> 24) & 0xFF, (ip >> 16) & 0xFF, (ip >> 8) & 0xFF, ip & 0xFF };
你可以通过网络发送这4个字节,按精确的顺序。除非你特别需要它作为4字节整数,而你可能不需要,因为你可能没有在&friends中使用sockaddr_

如果您已经将地址作为主机字节顺序的32位整数,则可以获得如下所示的
a

uint8_t a [4] = { 192, 168, 2, 1 };
uint32_t ip = getIPHostOrder();
uint8_t a [4] = { (ip >> 24) & 0xFF, (ip >> 16) & 0xFF, (ip >> 8) & 0xFF, ip & 0xFF };

这具有不依赖于实现定义的行为和可移植性的优点。

您可以采用
htonl
的实现,并包含在相关的编译单元中。“将字符串转换为主机到网络”什么?
hton*()
转换整数而不是字符串。在我的问题中做了必要的更改可能我看不到它很傻,但这在大端和小端系统上是如何工作的?谢谢-但我的代码是以主机Tio Netwrok格式返回的函数-因此上层接口层正在编写value@Erlkoenig这还取决于某个主机b吗yte顺序?不,不管主机顺序如何,它都应该工作。htonl实际上只是允许在中使用sockaddr_的一个肮脏的小把戏。如果您可以将单个字节(如a数组)直接发送到网络接口,则不需要htonl(和htons等).不幸的是,像这样检查主机字节顺序是实现定义的行为;虽然它可能总是按预期工作,但我会尽量避免这样的代码。