IP 地址:000 简化为 0?

Ken*_*ney 33 network-printer ip ubuntu brother-printer

我正在使用兄弟打印机驱动程序设置我的 Ubuntu,并试图使用我的打印机 IP 将我的电脑连接到打印机。

在我的打印机上,IP 地址是192.168.000.008. 所以我在我的设置中输入了这个来连接,但无济于事。

然而,当我进入192.168.0.8它的工作。我也可以连接到localhost:192.168.0.8连接到打印机设置服务器。

这是否意味着默认情况下,如果 IP 地址000简化为0?如果数字前有零,008它会简化为8吗?

IP地址的简化规则是什么?还有我失踪的其他人吗?如果我错了,那么为什么简化的192.168.0.8工作192.168.000.008没有?

更新:

我在这里关注本教程:https : //kbpdfstudio.qoppa.com/install-printer-driver-on-linux/

当我进入上述教程中的 Step7 时,我输入了 Y(在我的默认终端中,而不是网络浏览器 @Kamil Maciorowski @TJ Crowder),然后选择“输入 IP 地址”进行连接。我最初没有包括这个,因为我主要想知道 IP 缩短是怎么回事。抱歉缺少此信息!我在为 ubuntu 下载打印机驱动程序时遇到了困难,希望这对某些人有所帮助!

这里还附上了我奇怪的 IP @barlop 的图片: 兄弟显示器上的奇怪IP

use*_*686 92

前导零不是IPv4 地址语法的标准部分,并且没有适用于所有系统的单一“简化”规则。有些人会完全拒绝这样的地址,这是有充分理由的。而那些没有的,有两种解释这些地址的方法。

零填充点分十进制在最早的 IPv4 文档中有些常见,如今您会发现各种应用程序和许多“嵌入式”系统(打印机、电视、烤面包机),它们只是为您提供一个固定大小的xxx.xxx.xxx.xxx带零填充的输入字段. 在那些系统中,008只是十进制 8。

然而,在 PC 操作系统以及基于 Linux 的设备上,许多程序使用从几十年前从 BSD 系统继承而来的 IPv4 地址解析器,它接受一些不属于任何官方语法的变体。

在这个原始的 4.2BSDinet_aton()函数中,各个数字不必是十进制的:它们也可以用八进制或十六进制指定,就像在 C 和其他各种编程语言中一样。如果数字以 开头,0x则它是十六进制的,如果它仅以 a 开头,0则它是八进制的。请记住,八进制只有数字 0-7,这意味着08它不是一个有效数字(07 后跟 010)。

因此,您有两种不同的方法来处理带前导零的地址,它们可能会产生完全不同的值。例如,如果您输入011,这意味着在认为它是十进制补零的系统上是 11,但在认为它是八进制的系统上它变成 9。

结论:如果系统强制您以这种方式输入地址,您通常可以假设它只会通过删除前导零来“简化”地址。但在任何其他情况下,不要使用前导零,因为它们可以以不可预测的方式解释。

另见:https : //tools.ietf.org/html/draft-main-ipaddr-text-rep-02

  • 011变成九,也就是十进制的9;012 变为 10,即十进制 10 和十六进制 A。从来没有为此制定 RFC,但它 _is_ 在 POSIX 标准(通过 XPG、IIRC)中使用更常见的名称 [inet_addr](https://pubs.opengroup. org/onlinepubs/9699919799/functions/inet_addr.html) 比较 https://superuser.com/questions/857603/are-these-2-ip-addresses-the-same-11-12-13-14-011-012 -013-014 和 https://serverfault.com/questions/837450/iptables-is-changed-ip-addresses-that-start-with-047-to-39 (9认同)
  • @user1686 它绝对符合标准:https://pubs.opengroup.org/onlinepubs/9699919799/functions/getaddrinfo.html“使用`inet_addr`中指定的Internet标准点符号的地址字符串是有效的”,其中`inet_addr`与 `inet_ntoa` 一起描述,它指定了短路规则和部分“可能是十进制、八进制或十六进制” (2认同)

sea*_*e27 16

您正在考虑类似于字符串的 IPv4 地址,但实际上并非如此。换句话说,您知道每个.字符之间通常是 3 个字符,因此您正在努力遵守这一点。然而,它不是一个字符串;这是一个 4 字节的数字。?3232235528?是写入您提供的 IPv4 地址的有效方法。该.是八位字节之间的逻辑分离,使其更容易对一个人破译。通过放置它们,您基本上将每个八位字节表示为一个 1 字节的数字,并将其放在每个.字符之间。

为了简化一点点,你输入什么(这里X << Y是左移位运算符,表示移位数X由左Y位):

192 << 24 + 168 << 16 + 0 << 8 + 8 << 0 = 3232235528?

现在,我并不是说您可能是路由器的 Web GUI(只是一个随机示例)会采用它(某些 GUI 要求八位字节分离),但是作为对您来说有趣的练习,请转到您的命令行(sh 用于 linux, cmd for windows)并运行

平 2130706433。

这相当于打字

平 127.0.0.1

它被 ICMP 命令接受。

作为更多的奖励事实,它可能会帮助您了解其背后的软件(因为如果不是在硬件级别完成,您在计算机上所做的就是用编程语言编写的)。从 StackOverflow 查看这个答案为什么 08 在 Java 中不是有效的整数文字?. 这个答案解释了一些编程语言将前导 0 解释为什么。C/C++ 也有这种行为。您可能会感兴趣地知道,许多操作系统的使用都是用 C 编写的(至少,*nix 是,并且扩展为 OSX)。

尽管如此,我认为 user1686 有更明确的解释和历史(这可能更有用)。


归档时间:

查看次数:

6189 次

最近记录:

5 年,5 月 前