我们正在编写嵌入式应用程序代码并验证有效IPv4格式的字符串。我使用字符串标记符成功地能够这样做但现在我需要使用htonl()函数将整数转换为主机到网络顺序。
由于它是一个嵌入式应用程序,我不能只使用网络头和库来使用htonl()函数。
C ++中是否有任何方式/非网络标头可以利用htonl()功能?
答案 0 :(得分:1)
来自htonl()
的手册页:
htonl()函数将无符号整数hostlong从主机字节顺序转换为网络字节顺序。
Network byte order实际上只是大端。
您需要做的就是编写(或查找)将无符号整数转换为大端的函数,并使用它代替htonl
。如果您的系统已经处于大端,那么您根本不需要做任何事情。
您可以使用以下内容确定系统的字节顺序:
int n = 1;
// little endian if true
if(*(char *)&n == 1) {...}
您可以使用以下内容将小端uint32_t
转换为大端:
uint32_t htonl(uint32_t x) {
unsigned char *s = (void *)&x;
return (uint32_t)(s[0] << 24 | s[1] << 16 | s[2] << 8 | s[3]);
}
答案 1 :(得分:1)
你并不严格需要htonl。如果您将IP地址作为单独的字节,如下所示:
uint8_t a [4] = { 192, 168, 2, 1 };
您只需按照确切的顺序通过网络发送这4个字节。这是除非你特别需要它作为一个4字节的整数,你可能不会,因为你可能没有使用sockaddr_in&amp;朋友。
如果您已经将地址作为主机字节顺序的32位整数,则可以像这样获得a
:
uint32_t ip = getIPHostOrder();
uint8_t a [4] = { (ip >> 24) & 0xFF, (ip >> 16) & 0xFF, (ip >> 8) & 0xFF, ip & 0xFF };
这样做的好处是不依赖于实现定义的行为并且可以移植。