• ベストアンサー

16進数の話

下記のページの「ネットワーク・バイト・オーダー(エンディアン)」の項で http://www.atmarkit.co.jp/fwin2k/network/baswinlan010/baswinlan010_02.html これを16進数で表現すると「0xc0.0xa8.0x00.0x01」となり、4bytesの1つの数値で表現すると「0xc0a80001」という数値になる。 とう箇所があるのですが、「0xc0.0xa8.0x00.0x01」と「0xc0a80001」では全く別の数字になりますよね。 これの意味が分かりません。どなかたご教授よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

> 全く別の数字になりますよね なるね。でもそれで良いんだよ。  まず、数値というのは、ビット列を「数値だと」解釈しているに過ぎない。大切なのはビット列だ。なので、@ITには申し訳ないがここの解説がちょっとまずいんだと思うな。  IPアドレス変換うんぬんで説明するから分からないのであって、最初から4バイトの整数で説明すると良かったんじゃないかな。  ここの表現には惑わされず、 ・ネットワークでは1バイトずつしか遅れない ・て事は2バイト以上のデータは分割しないといけない ・それ(分割の方法)が送り側と受け側で違っているとまずい という事を押さえておいてくれると良いと思う。IPアドレス変換も、socketを使って低レベルなネットワークプログラムを作る時には必要になるんやけどね。

その他の回答 (4)

  • ency
  • ベストアンサー率39% (93/238)
回答No.5

No4 ency です。 No3 ymmasayan さんと回答内容がかぶっていましたね。。。 気づいていませんでした。 # しかも、ymmasayan さんの回答のほうが、より簡潔でわかりやすいし。。。 失礼いたしました。>ymmasayan さん。

  • ency
  • ベストアンサー率39% (93/238)
回答No.4

IP アドレスは 32 ビットで表現される値であり、 0xc0a80001 が本当の値です。 しかし、この値をなじみのある (?) 10進表現するために、以下の変換をしています。 # わかりやすくするために「0x」は省略します。 # 「0x」は16進表現であるという印以外の意味はないですからね。 1) 1バイトずつ区切る。  c0a80001 ⇒ c0 a8 00 01 2) 区切った1バイトを10進表現する  c0 a8 00 01 ⇒ 192 168 0 1 3) 10進表現した4つの数値をピリオドでつなぐ  192 168 0 1 ⇒ 192.168.0.1 このようなルールを作った理由は、そのまま 10進表現すると 3,232,235,521 というように非常に大きな値になってしまうためです。 # そもそも、10進表現にする必要があったのか、というのは # また別の話。 つまり、逆の言い方をすると、IP アドレスに限って言えば、  192.168.0.1 ⇒c0.a8.00.01 という表記は  c0a80001 と等価なわけです。 # ピリオドを取って、全部くっつけただけですけど。。。 それぞれの数値 (16進表現) の先頭に「0x」をつけた場合が、該当箇所の表記方法になりますよね。 そして、IP アドレスを 10進表現する場合には、必ず上記ルールを適用することになっていますので、変換前と変換後の数値が別の値になっても構わないわけです。 ちなみに、このページの該当箇所は「ネットワークのバイトオーダーはビッグエンディアンだ」ということの説明で、その一例として IP アドレスの場合を取り上げている、ってことですよね。 こんな回答でいかがでしょうか?

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.3

IPアドレスは32ビットを(128.246.56.234)などとする事が多いですよね。 これは人間にわかりやすくするために4バイトを1バイトずつ区切り更に10進で表示しています。 ご質問のケースは1バイトづつ区切り、16進で表しています。 そういうことで、「0xc0.0xa8.0x00.0x01」と「0xc0a80001」は同じ物です。

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.2

それぞれの数字の先頭にある0xは、 「これに続く数字は16進法ですよ」 ということを表しています。 これはもともとC言語の記法です。 だから、16進数で表現しているという前提だと、上の表現は、 >これを16進数で表現すると「c0.a8.00.01」となり、 >4bytesの1つの数値で表現すると「c0a80001」という数値になる と書いてもいいわけです。わざわざ0xをつけたのは、 16進数であることを強調するためか、 書いた人がC言語になれているためでしょう。

関連するQ&A