• ベストアンサー

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

  • パターンマッチングの限界?(最大文字数)

    perl正規表現のパターンマッチングでは,対象文字列が長すぎると正しくマッチしないというような,perlの仕様あるいはバグが存在するのでしょうか? ■状況 CGIフォームから入力された文字列に機種依存文字(EUC未定義文字)が含まれていないかチェックするため,以下のようなスクリプトを書きました。テストでは,ほとんどの場合は正常に動作しましたが,定義文字=パターンマッチするはずの文字に,未定義文字が含まれていると誤判断されてしまうケースがありました。いろいろ試してみたところ,どうも文字数32,768バイトを超えた場合に限られるようだ,というところまで判りました。 ドキュメントなどを見ても,そのような仕様については見つからず,どなたかご存知ないでしょうか。 あるいはスクリプトに不備があればご指摘いただけたらと思います。 よろしくお願いいたします。 if (&is_undef($input_text)) { print "未定義文字が含まれています。"; } … sub is_undef { my ($text, $character_strict); $text = $_[0]; # EUC-JP文字(定義文字) $character_strict = '(?:[\x20-\x7E]|' # ASCII  . '[\xA1\xB0-\xCE\xD0-\xF3][\xA1-\xFE]|' # 1,16-46,48-83区  . '\xA2[\xA1-\xAE\xBA-\xC1\xCA-\xD0\xDC-\xEA\xF2-\xF9\xFE]|' # 2区  . '\xA3[\xB0-\xB9\xC1-\xDA\xE1-\xFA]|' # 3区  . '\xA4[\xA1-\xF3]|' # 4区  . '\xA5[\xA1-\xF6]|' # 5区  . '\xA6[\xA1-\xB8\xC1-\xD8]|' # 6区  . '\xA7[\xA1-\xC1\xD1-\xF1]|' # 7区  . '\xA8[\xA1-\xC0]|' # 8区  . '\xCF[\xA1-\xD3]|' # 47区  . '\xF4[\xA1-\xA6])'; # 84区 $text =~ s/\r//g; $text =~ s/\n//g; $text =~ s/\t//g; if ($text =~ /^$character_strict*$/) {  return; } else {  return 1; } }

    • ベストアンサー
    • Perl
  • 10進数 → 2進数

    小数点を含んだ実数の、10進数から2進数への変換のやり方がよくわかりません。できるときとできないときがあります。たとえば、 (0.1)_10 = (0.0001100110011・・・)_2 ※(A)_xとは、数値Aのx進数表現というイミです。以下もこの表現を使います。 となるらしいですが、どうやればいいのでしょうか?わかりません。 また、ついでに聞いておきたいことがもう一つあります。小数点を含まない数値の 変換も教えていただきたいです。 たとえば今までぼくは、(101)_10を2進数に変換するのに、 (101)_10 = (100 + 1)_10 = ( 2^2・25 + 1 )_10 = ( 2^2・( 2^3・(2 + 1) + 1 ) +1 )_10 = (2^6 + 2^5 + 2^2 + 2^0 )_10 = (1100101)_2 などという、めんどくさいことをやっていたのですが、もっとスマートなやりかたはないでしょうか? コンピュータもいちいちこんなやり方でやっていたら、計算量多すぎてやってられないような気がするので、きっとあると思うんですけど…簡潔なアルゴリズム…

  • Endianについて パート2

    elttacさん、Tacosanさん、terrar5さん、先日はありがとうございました。どうしても、疑問でならない部分がありまして、よろしければ、もう少しお付き合いよろしくお願い致します。 /--------------------------------------------------------------------------- エディアンとは、2 バイト以上の数値データを記録・転送するときの 「各バイトの並べ方」です。 たとえば,2 バイトの数値 0x0102(10 進数で 258)を考えましょう。ビッグエンディアンでは,この格納順は正順,つまり,   01 02 になります。 -------------------------------------------------------------------------------/ 1バイト目の0x02(2進数で 0000,0002)ですが、これも並び順によっては、0x20になっちゃったりしないのでしょうか? 1バイトでもビット単位で並び順が違えばさかさまになるような気がしまして。(1台のPC上では、バイト単位で処理しているので、大丈夫!? ネットワークでは、1bit単位でデータが転送されていますので???) ビット単位でもビッグエンディアンやリトルエンディアンみたいなのがあるのでしょうか?

  • 正規表現で数字をメタ文字に置換えると結果が異なる理由が分かりません。

    正規表現で数字をメタ文字に置換えると結果が異なる理由が分かりません。 現在、正規表現でチェックするコードがあります。 この正規表現中の数字「9」を「\d」に置換えました。  置換え前)  置換え後)   9([x]c+)*&  \d([x]c+)*& VisualStudio2008のC#にて実装し、文字列「9xc1&」で テストすると結果が異なりました。 (Regexクラスのオプションはデフォルトのまま) Regex.IsMatch("9xc1&", @"9([x]c+)*&") == false Regex.IsMatch("9xc1&", @"\d([x]c+)*&") == true 置換え前が正しいと思うのですが、メタ文字に置換えると グループやアスタリスクの影響を受けるのでしょうか? アドバイスをお願い致します。

  • 2直線が直交する点の求め方が分かりません

    数学で分からない問題があるので質問させていただきます。 3つの点 A(Xa,Ya,Za)、B(Xb,Yb,Zb)、C(Xc,Yc,Zc)与えられているとして、 点A,Bを通る直線ABに、点Cから垂直に線を引く場合に、 2直線の交点D(X,Y,Z)の座標を求める方程式が分かりません。 (Xb-Xa)(X-Xc)+(Yb-Ya)(Y-Yc)+(Zb-Za)(Z-Zc)=0 一つは思いつきましたが、変数が3つあるのであと2つ 式が必要になると思います。 分かる方がいたら教えていただけませんか。 よろしくお願いします。

  • ゼネラルフローチャートの作り方。

    数値解析実習という授業で「補間法」をやっているのですが このプログラムのディテールフローチャートは書けるのですが ゼネラルフローチャートをどのようにかいていいのかがわかりません。 「開始」  ↓ 「変数宣言」  ↓ この先どうなるのでしょう??? #include <stdio.h> #include <math.h> void main(void) { double xa,xb,xc,h; double ya,yb,yc; double xx,yy,dela,delb,del2a; printf("3点のx座標a,b,c="); scanf("%lf%lf%lf",&xa,&xb,&xc); printf("3点のy座標fa,fb,fc="); scanf("%lf%lf%lf",&ya,&yb,&yc); printf("補間点のx座標x="); scanf("%lf",&xx); h=xb-xa; dela=yb-ya; delb=yc-yb; del2a=delb-dela; /*二次補間公式*/ yy=ya+dela/h*(xx-xa)+del2a/(2.0*h*h)*(xx-xa)*(xx-xb); printf("補間点f(%lf)=%lf\n",xx,yy); } ディテールは細かく書くだけっぽいのでそのまま出来たのですが・・・。 ゼネラルのほうがおおまかな流れを書くみたいですがどこを書いて良いのかわかりません。 教えてください。

  • stopエラーの対処方法を教えてください。

    最近,頻繁にSTOPエラーが発生して大変困っております。エラー表示として、 STOP:0x0000008E(0XC0000005,0x805529E9,0x61FC83c,0x00000000) STOP:0x0000008E(0XC0000005,0x8055259A,0xBA78600,0x00000000) STOP:0x0000008E(0XC0000005,0x80552559,0xA13D5854,0x00000000) などが、今日だけでも何度も発生します。ここ30分で発生したものだけ書き込みました。初心者なのでわかりやすい回答を期待します。 コンピュータ情報:DELLのPRECISION WORKSTAION 650 3.06GHz,3.00GB RAM システム:Windows XP Professional Servsice Pack2 ちなみに、中古で買ったので、リカバリーソフトはありません。

  • 連立一次方程式の解法プログラム

    数値解析で A(3,3)、B(3)、X(3)としたときに AX=B の計算でXを求めたいのですが Aの対角項が0なのでLapackやGaussの消去法が使えません 何か有効な数値計算法を教えていただきたいです。お願いします。

  • クールノーモデルに関する質問です。

    クールノーモデルに関する質問です。 いま、A,B,Cの3企業が寡占を行っていた市場で、AとBが結託してDという企業となりCとDが複占する市場とする方が、AとBにとって有利ということはありますか? 具体的に書きますと、市場の需要曲線がP=a-X, (X=xa+xb+xc、X=xc+xd) 、各企業の費用関数がC=cx、であるとします。 この時、もともとの3社での寡占状態ですと、ナッシュ均衡はxa=xb=xc=(a-c)/4となり、各企業の利潤は各々π=(a-c)^2/16となると思います。ここで、AとBが合併して一つの企業Dとなった場合、CとDによる複占市場となると考えると、ナッシュ均衡はxc=xd=(a-c)/3、π=(a-c)^2/9となると思います。そして、この企業Dの利益をもともとのAとBが分け合うと考えると、それぞれの利益はπ=(a-c)^2/18となってしまい、もともとのπ=(a-c)^2/16より減少してしまいます。 このように考えると、企業AとBは結託しない方が有利という結果となります。しかし、結託しても元の水準の生産は可能であるし、結託すれば各々の企業の生産量を知り、またコントロール出来るなど、結託した方が有利なように感じます。上記の考え方のどこかに問題があるのだと思われますが、どこがおかしいのでしょうか。(合併しても各企業の費用関数は変化しないものとします。)

  • 二項定理

    数学Aの問題なんですけど、 次の式の展開式における、[]内に指定された項の係数を求めよ。 (x2+x+1)5 [x5] というのがどうしても分かりません… 解説を見ると(x2+x)5の展開式におけるx5の項の係数は5C5 とか書いてるんですけど良く分かりません。 (半角数字は乗、全角は数字です) 分かる方、丁寧に教えてください! お願いします。

このQ&Aのポイント
  • DCP-J577Nでタッチ画面が反応せず、黒インクが紙に写らない問題について相談です。
  • 使用しているDCP-J577Nのタッチ画面が反応せず、黒インクが出てこないトラブルを解決したいです。
  • DCP-J577Nのタッチ画面が反応しない問題と黒インクが写らない問題について質問です。
回答を見る