192.056.2.01是v4 ip的有效表示吗?

时间:2014-08-28 07:30:44

标签: networking ip

我正在编写一些代码来将存储在字符串中的v4 ip转换为自定义数据类型(在这种情况下为4个整数的类)。

我想知道我是否应该接受ips,就像我在标题中输入的那样,或者只有ips没有前面的零,让我们看一个例子。

这两个ips对我们(人类)代表相同,例如Windows网络配置接受它们:

192.56.2.1和192.056.2.01

但我想知道第二个是否真的正确。

我的意思是,根据RFC是第二个ip有效吗?。

提前致谢。

4 个答案:

答案 0 :(得分:3)

注意,inet_addr(3)是Unix的标准API之一,用于将IPv4地址的文本表示转换为内部表示,并将056解释为八进制数:

  

作为IPv4点分十进制表示法中的部件提供的所有数字可以是十进制,八进制或十六进制,如ISO C标准中所指定的(即,前导0x或0X表示十六进制;否则,前导' 0& #39;表示八进制;否则,该数字被解释为十进制)。

inet_ntop(3)getaddrinfo(3)这样的弟弟都是一样的:

摘要

虽然所有平台上的192.056.2.01 等IP地址的文字表示可能有效,但不同的操作系统会将其解释为不同

这足以让我避免采用这种文字表示方式。

答案 1 :(得分:1)

<强>赞成

在十进制numerotation 056 等于 56 所以为什么不呢?

<强>缺点

0XX 格式通常用于八进制数字

无论您的决定是什么,只需将其放在您的文档上即可。)

答案 2 :(得分:0)

定义是否正确取决于您的实施。 正如您所提到的,Windows OS认为它是正确的,因为它在解析IP时会删除任何前导零。

因此,如果在您的程序中设置了适当的逻辑,例如存储在4个整数类中的IP的每个子集,而没有前导零,那么它也适用于您的情况。

答案 3 :(得分:0)

Textual Representation of IPv4 and IPv6 Addresses是一个“互联网草案”, 我想,这就像RFC想要的那样。 (此外,它在十年前到期,2005-08-23, 而且,显然,还没有重新发行, 所以它甚至不接近官方。) 无论如何,它在Section 2: History说,

  

原始IPv4“点缀八位字节”格式从未在任何RFC中完全定义,   所以有必要看一下用法,   而不仅仅是找到一个权威的定义,   确定有效语法是什么。   RFC系列中第一次提到虚线八位字节是......   四个点分开的部分,每个部分由   “三位数表示0到255范围内的整数值。”

     

几个月后,[IPV4-NUMB] ......   使用点分十进制格式,将每个编码的八位字节零填充为三位数   ⋮
  与此同时,   一个非常流行的IP网络实现朝着自己的方向发展。   4.2BSD引入了一个函数inet_aton(),...   除了十进制之外,[允许]允许八进制和十六进制,   使用C语言语法区分这些基数   涉及前缀“0”或“0x”,并允许数字任意长。

     

4.2BSD inet_aton()已被广泛复制和模仿,   因此是事实上的标准   用于IPv4地址的文本表示。   然而,这些替代语法现在已经不再使用了......   [和]除十进制八位字节外的所有表格都被视为非标准格式   (尽管具有相当广泛的互操作性)且不受欢迎。

所以,即使POSIX defines the behavior of inet_addr 将前导零解释为八进制(并将前导“0x”解释为十六进制), 避免它可能是最安全的。

P.S。 RFC 790已被RFC 1700淘汰, 它使用一位,二位或三位数的十进制数, 没有前导零。