IP字符串与整数互转可通过手动解析或系统函数实现:手动方式使用istringstream分割并移位组合,或通过位操作拆分整数;系统函数如inet_addr和inet_ntoa(推荐inet_pton/inet_ntop)更简洁但具平台依赖性。

在C++中,IP地址字符串(如"192.168.1.1")和整数之间的相互转换是一个常见的网络编程需求。这种转换通常用于简化IP地址的存储、比较或计算。下面介绍如何实现这两种格式的互转。
IP字符串转为整数
将点分十进制的IP字符串转换为32位无符号整数,本质是把每一段解析成字节,然后按大端序组合成一个整数。
- 使用
std::istringstream配合std::getline逐段提取数字 - 每段转换为整数后左移对应位数合并
- 需验证每段是否在0~255范围内
示例代码:
#include#include #include uint32_t ipToInteger(const std::string& ip) { uint32_t result = 0; std::istringstream iss(ip); std::string segment; int shift = 24;
while (std::getline(iss, segment, '.') && shift >= 0) { int num = std::stoi(segment); if (num < 0 || num > 255) { throw std::invalid_argument("Invalid IP segment"); } result |= (static_cast(num) << shift); shift -= 8; } return result; }
整数转为IP字符串
将32位整数拆解为四个8位字节,再拼接成点分格式的字符串。
立即学习“C++免费学习笔记(深入)”;
- 通过右移和掩码操作提取每个字节
- 用
std::to_string转为字符串并拼接- 注意字节顺序保持网络字节序(大端)
示例代码:
std::string integerToIp(uint32_t num) { std::string ip; for (int i = 24; i >= 0; i -= 8) { ip += std::to_string((num >> i) & 0xFF); if (i > 0) ip += "."; } return ip; }使用系统函数(POSIX兼容)
在支持POSIX的系统上,可以使用
inet_addr和inet_ntoa进行转换。示例:
#include// Linux/macOS // #include // Windows // 字符串转整数(返回网络字节序) in_addr_t ipToInt(const char* ip) { return inet_addr(ip); }
// 整数转字符串 std::string intToIp(in_addr_t num) { struct in_addr addr; addr.s_addr = num; return inet_ntoa(addr); }
注意:
inet_addr已弃用,推荐使用inet_pton;inet_ntoa不是线程安全的,建议用inet_ntop替代。基本上就这些。手动实现更可控,系统函数更简洁但依赖平台。根据项目需求选择合适方式即可。











