【206】VS2022 C++ 实现无符号32位整数和IP地址字符串互相转换
无符号32位整数和IP地址字符串之间的理论关系,可以参考我的前一篇文章:【205】Python3 实现整数和IP地址字符串互相转换
下面是具体的代码实现,已经在 VS 2022上调试通过。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//0.0.0.0
// 255.255.255.255
// IP字符串转无符号32位整数
bool ipToUint(const char* const inIp, unsigned int* outN) {const int charArrSize = 16;size_t len = strlen(inIp);if (len > 15 || len < 7) {printf("Length of inIp is greater than 15 or less than 7!\n");return false;}int dotNum = 0;for (int i = 0; i < len; i++){char c = inIp[i];if (c == '.') {dotNum++;}}// 字符串的IP地址必须含有三个点if (dotNum != 3) {printf("Ip string must has 3 dot !\n");return false;}char str1[charArrSize] = "";char str2[charArrSize] = "";char str3[charArrSize] = "";char str4[charArrSize] = "";dotNum = 0;for (int i = 0; i < len; i++) {char c = inIp[i];if (c == '.') {dotNum++;}else if (0 == dotNum) {size_t lenSub = strlen(str1);str1[lenSub] = c;str1[lenSub + 1] = '\0';}else if (1 == dotNum) {size_t lenSub = strlen(str2);str2[lenSub] = c;str2[lenSub + 1] = '\0';}else if (2 == dotNum) {size_t lenSub = strlen(str3);str3[lenSub] = c;str3[lenSub + 1] = '\0';}else if (3 == dotNum) {size_t lenSub = strlen(str4);str4[lenSub] = c;str4[lenSub + 1] = '\0';}}if (0 == strlen(str1) || 0 == strlen(str2) || 0 == strlen(str3) || 0 == strlen(str4)) {printf("Failed to split ip string !\n");return false;}unsigned int n1 = atoi(str1) << (8 * 3);unsigned int n2 = atoi(str2) << (8 * 2);unsigned int n3 = atoi(str3) << 8;unsigned int n4 = atoi(str4);unsigned int n = n1 + n2 + n3 + n4;(*outN) = n;return true;
}// 无符号32位整数转IP字符串
bool uintToIp(const unsigned int inNum, char* outIp, int outIpSize)
{if (outIpSize < 16) {printf("outIpSize must be greater then or equal 16!\n");return false;}int ret = -1;int ipInt_4 = inNum & 255;int ipInt_3 = (inNum >> 8) & 255;int ipInt_2 = (inNum >> (8 * 2)) & 255;int ipInt_1 = (inNum >> (8 * 3)) & 255;// sprintf_s 返回值:写入的字符数或 -1(如果发生错误)。 如果 buffer 或 format 是 null 指针,sprintf_s 和 swprintf_s 将返回 -1 并将 errno 设置为 EINVAL。ret = sprintf_s(outIp, outIpSize, "%d.%d.%d.%d", ipInt_1, ipInt_2, ipInt_3, ipInt_4);if (-1 == ret) {printf("uintToIp sprintf_s error.\n");return false;}return true;
}int main(int argc, char** argv) {char ip1[16] = "0.0.0.0";unsigned int n;ipToUint(ip1, &n);printf("ip=%s, integer=%u\n", ip1, n);char ip2[16];bool flag = uintToIp(n, ip2, 16);printf("%s flag=%d\n", ip2, flag);sprintf_s(ip1, "255.89.9.0");n;ipToUint(ip1, &n);printf("ip=%s, integer=%u\n", ip1, n);flag = uintToIp(n, ip2, 16);printf("%s flag=%d\n", ip2, flag);return 0;
}