ubuntu – IPアドレス。000は0に簡略化?

brother-printer ip network-printer printer-ubuntu ubuntu

Ubuntuをブラザープリンタードライバーで設定していて、プリンターのIPを使ってPCをプリンターに接続しようとしていました

私のプリンタでは、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はうまくいかなかったのでしょうか?

update:

私はここでこのチュートリアルに従っていた:https://kbpdfstudio.qoppa.com/install-printer-driver-on-linux/

上記のチュートリアルのStep7にたどり着いたとき、Yを入力して(Webブラウザ@Kamil Maciorowski @T.J. Crowderではなく、デフォルトの端末で)、「IPアドレスを入力」を選択して接続しました。私は主にIP短縮の件で何がどうなっているのか知りたかったので、当初は入れませんでした。欠落していた情報で申し訳ありませんでした!私はubuntuのプリンタドライバをダウンロードするのに苦労しましたので、うまくいけば、これは何人かの人の助けになります

また、ここに添付されているのは、私の変なIP @barlopの画像です。weird IP on brother display

  33  None  2020-06-01


ベストアンサー

先頭のゼロはIPv4アドレス構文の標準的な部分ではなく、すべてのシステムに適用される単一の「単純化」ルールはありません。一部のシステムでは、そのようなアドレスを完全に拒否しますが、それには正当な理由があります。そうでない場合は、そのようなアドレスを解釈する2つの方法があります

ゼロパディングされた10進数は、初期のIPv4文書では多少一般的でしたが、最近では、様々なアプリや多くの「組み込み」システム(プリンタ、テレビ、トースター)で、ゼロパディングされた固定サイズのxxx.xxx.xxx.xxx入力フィールドを単に与えるだけのものが見られます。このようなシステムでは、008は単なる10進数8です

しかし、PC オペレーティングシステムや Linux ベースのデバイスでは、多くのプログラムが数十年前の BSD システムから継承した IPv4 アドレスパーサを使用しており、公式の構文には含まれないいくつかのバリエーションを受け入れています

このオリジナルの 4.2BSD inet_aton() 関数では、個々の数値は 10 進数である必要はありません: C や他の様々なプログラミング言語のように、8 進数や 16 進数で指定することもできます。数値が 0x で始まる場合は 16 進数で、 0 だけで始まる場合は 8 進数です。そして、8進数は0から7までの数字しかないことを覚えておいてください

つまり、先頭のゼロを持つアドレスを扱う方法は2つあり、全く異なる値になる可能性があります。例えば、011と入力した場合、ゼロパッド10進数だと考えるシステムでは11を意味しますが、8進数だと考えるシステムでは9になります

結論から言うとシステムがこのようにアドレスを強制的に入力させる場合、通常は先頭のゼロを削除することでアドレスを「単純化」すると考えることができます。しかし、それ以外の状況では、予測できない方法で解釈される可能性があるため、先頭のゼロは使用しないでください

こちらも参照してください。https://tools.ietf.org/html/draft-main-ipaddr-text-rep-02

92  user1686  2020-06-01


あなたはStringのようなIPv4アドレスを考えていますが、それは何かというとそうではありません。言い換えれば、各.文字の間が通常3文字であることを知っているので、それに準拠しようとしているということです。しかし、これは文字列ではなく、4バイトの数値です。‭3232235528‬は、提供されたIPv4アドレスを書くための有効な方法です。.は、人間が解読しやすいようにオクテットを論理的に区切ったものです。これらを配置することで、基本的には各オクテットを1バイトの数値として表現し、各.文字の間に配置することになります

少し単純化すると、あなたが入力しているのは (X << Y は左シフト演算子で、数値 XY ビット分左にシフトすることを示します) です

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

今, 私は多分あなたがルータのWeb GUIを言っているわけではありません (ランダムな例として) それを取るでしょう (いくつかのGUIの要求オクテット分離), しかし、あなたのための楽しい練習として, あなたのコマンドラインに移動します (linuxのためのsh, windowsのためのcmd) と実行

ping 2130706433.

それはタイピングに相当します

ping 127.0.0.1

で、ICMPコマンドで受け付けています

さらにボーナス事実として、その背後にあるソフトウェアを知っておくと役立つかもしれません(コンピュータで行うことは、ハードウェアレベルで行われていない場合はプログラミング言語で書かれているので)。StackOverflow の なぜ 08 は Java では有効な整数リテラルではないのか?この回答では、いくつかのプログラミング言語が先頭の 0 をどのように解釈しているかを説明しています。C/C++にもこのような振る舞いがあります。また、多くの OS が C で書かれていることを知っていると、興味が湧くかもしれません(少なくとも *nix はそうですし、その延長で OSX もそうです)

以上のことから、user1686さんの方がずっとわかりやすい説明と履歴があると思います(そちらの方が便利かもしれません)

16  searchengine27  2020-06-02


192.168.0.8」のような値はIPアドレスではありません。これはIPアドレスの表現です。実際の IP アドレスは、3232235528 や 0xC0A80008 のような 32 ビット整数にすぎません。しかし、これでは人間が他のIPアドレスと比較して覚えるのは少し難しいので、コンピュータが人間にそのようなアドレスを表示するときには必ず、いわゆる「ドット付き10進数」という表記を使います。数字は「オクテット」(バイト)に分割され、それぞれが整数で表されます。シェルに「ping 3232235528」や「ping 0xC0A80008」と入力することで確認できます

ここで重要なのは、10進法の各数値は単なる数値であることを理解することです。数学的には、8 = 008 = 8.000 = 008.000 となります

ping 192.168.000.008」が失敗した理由は、pingがアドレスをどのように解釈したかに関係しています。上で「8 = 008」と言ったのは知っていますが、ping ユーティリティにとっては、それは厳密には真実ではありません。歴史的に見ても、16 進法が登場する前は、2 進法に関係する何かをしようとすれば、誰でも 2 進数の 8 進数表現を使用していました。初期のプログラマーたちは、これがどんな問題を引き起こすかを理解していなかったため、先頭のゼロで書かれた数字は10進数ではなく8進数であるという慣習を確立しました。良くも悪くも ping は今でもこの表記法を尊重しています。ユーティリティは最後のオクテットが “008” であることを見て、これを 8 進数として解釈しようとしましたが、失敗しました (8 進数は 0 から 7 までの数字しか使わないので)。あなたのプリンタはこの表記法を使わず、各オクテットを10進数として解釈します

3  HiddenWindshield  2020-06-02


他の回答では、テキスト入力としてのIPアドレスの様々な表現について説明しています。しかし、プリンタがそのIPを192.168.000.008と報告するのは、たいていの場合、怠惰なプログラミングによるものです。数値をテキストにフォーマットするときは、固定の文字数を想定した方が簡単です

2  MooseBoys  2020-06-03


タイトルとURLをコピーしました