我正在编写一些代码来将存储在字符串中的v4 ip转换为自定义数据类型(在这种情况下为4个整数的类)。
我想知道我是否应该接受ips,就像我在标题中输入的那样,或者只有ips没有前面的零,让我们看一个例子。
这两个ips对我们(人类)代表相同,例如Windows网络配置接受它们:
192.56.2.1和192.056.2.01
但我想知道第二个是否真的正确。
我的意思是,根据RFC是第二个ip有效吗?。
提前致谢。
答案 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”解释为十六进制),
避免它可能是最安全的。