【问题标题】:C++ how to convert ip address to bytes?C ++如何将IP地址转换为字节?
【发布时间】:2014-08-02 04:42:57
【问题描述】:

如何在 C++ 中将 IP 地址转换为字节?基本上我如何解析IP地址?例如,如果我有一个等于121.122.123.124 的字符串。 我需要解析这个byte1 = 121byte2 = 122byte3 = 123byte4 = 124

【问题讨论】:

  • getline. 作为分隔符值得研究。
  • 我曾尝试一次读取一个字符,但我无法弄清楚如何让它从 byte1 切换到 byte2 等等,以此类推。找到了。

标签: c++


【解决方案1】:

使用sscanf()函数:

#include <cstdio>

char arr[] = "192.168.1.102"; 
unsigned short a, b, c, d;
sscanf(arr, "%hu.%hu.%hu.%hu", &a, &b, &c, &d);

【讨论】:

  • 你为什么要手动 NUL 终止你的字符串?编译器会为你做这件事,你知道的。
  • 是的,你说得对。我已经从字符串文字中删除了\0。谢谢
  • 这应该是 unsigned char(每个 1 个字节,因为它是 IPv4)。不是unsigned short,这是误导+浪费内存,当然%c格式说明符。
  • 如果您更改为 %c 或 %hc,此代码将不起作用。
【解决方案2】:

使用inet_aton

#include <arpa/inet.h>
#include <string>
#include <iostream>

int
main(int argc, char *argv[])
{
  std::string s;
  in_addr addr;

  while(std::cin >> s && inet_aton(s.c_str(), &addr)) {
    std::cout << inet_ntoa(addr) << "\n";
  }
}

【讨论】:

    【解决方案3】:

    如果pattern是常量,number dot number dot等,则使用istringstream:

    #include <sstream>
    using namespace std;
    
    int byte1, byte2, byte3, byte4;
    char dot;
    char *ipaddress = "121.122.123.124";
    istringstream s(ipaddress);  // input stream that now contains the ip address string
    
    s >> byte1 >> dot >> byte2 >> dot >> byte3 >> dot >> byte4 >> dot;
    

    【讨论】:

    • 谢谢,我不需要设置点是什么如dot = '.'?如果 IP 地址类似于 12.34.56.123,这仍然有效吗?
    • >> 运算符过载,因此它知道如何根据您提供的变量类型提取数据。由于您提供了一个字符(命名为点),因此它会将点提取为字符。 dot 仅用作点跳线。 byte# 是一个 int,所以无论有多少位,>> 都会将其提取为 int,所以,是的,它会正确解析。
    • 此方案不接受有效输入字符串“127.1”,也不会拒绝无效输入字符串“300.1.1.1”。
    • 正确。看看我在回答开头写的内容。
    【解决方案4】:

    试试这个:

    char ipstr[] = "121.122.123.124";
    char *marker, *ret;
    unsigned char b1, b2, b3, b4;
    ret = strtok_r(ipstr, ".", &marker);
    b1 = (unsigned char)strtod(ret, NULL);
    ret = strtok_r(NULL, ".", &marker);
    b2 = (unsigned char)strtod(ret, NULL);
    ret = strtok_r(NULL, ".", &marker);
    b3 = (unsigned char)strtod(ret, NULL);
    ret = strtok_r(NULL, ".", &marker);
    b4 = (unsigned char)strtod(ret, NULL);
    

    【讨论】:

    • 这是标记为 C++。为什么都是 C?
    • C 解决方案通常最好用更新的 C++ 方法代替。当你可以使用 C++ 时尝试只使用 C 有点不必要。
    • @chris:当您已经拥有熟悉的经过验证的解决方案时,仅仅因为它们是新方法而尝试使用新方法有点不必要。我自己更喜欢 boost::split。但是,如果您对 strtok 更满意,那么您应该使用它。
    • @BenjaminLindley,了解合作伙伴等阅读您的代码会知道和喜欢的事情是个好主意。现在总是开始学习常用的新东西的好时机(例如std::string,我必须说它比 C 数组好得多)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 2013-05-09
    • 2012-07-14
    • 2021-10-15
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多