【最大10000ポイント】当たる!!質問投稿キャンペーン!

Unixの"od"コマンドの出力結果について「?」があります。

以下のようにコマンド入力しました。

$ echo あ | od -x
0000000 a082 000a
0000003

「あ」の文字コードは0x82A0のはずですが、"od"コマンドの出力結果は"a082"となります。
これはどうしてでしょうか?
困っているわけではないのですが、すごーく気になるので、どなたか教えてください。


OS環境はRedHat Linux7.3で、TeraTermを使ってログインし、コマンドを入力しています。
TeraTermの漢字コードは「SJIS」にしています。
「EUC」に設定した場合でも同様の現象です。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

CPU アーキテクチャは Intel ですね?


Intel CPU においては「リトルエンディアン(little endian)」という形式で
データが転送されたり格納されたりします。
これはどういうことかというと、2バイト以上の長さのデータでは
上位バイトと下位バイトが逆転するのです。

それで本来 0x82,0xa0 という並びになるはずの数値が 0xa0,0x82
という表現をとるわけです。

このように下位の(小さい=little)方(end)が先頭に来る CPU を「little endian」、
逆に Sun SPARC など素直に上位バイト、下位バイトの順に並ぶ CPU を
「ビッグエンディアン(big endian)」と呼びます。

ちなみに、この「リトルエンディアン(little endian)」や「ビッグエンディアン(big endian)」
という語はスウィフトの「ガリバー旅行記」に由来し、
卵の尖った方から食べるのが正しいと主張する一派を「リトルエンディアン」、
丸いほうから食べるべしと唱えた一派を「ビッグエンディアン」
と呼んだことから始まります。ハッカー(スーパープログラマ)一流の洒落ですね。

参考URL:http://www.atmarkit.co.jp/icd/root/00/49717200.h …
    • good
    • 0
この回答へのお礼

IBMのAIXで"od"コマンドを使ってみましたが、Linuxとは異なる結果(私が期待していた結果ですね)になりました。
とても勉強になりました。どうもありがとうございます。

お礼日時:2003/05/14 18:38

検索キーワードは,



・バイトオーダー
・(ビッグ/リトル)エンディアン

などです.
移植性のあるプログラムを開発しようとするときは必須の知識ですね.
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語のHP-UXからLinuxへのポーティング

C言語で開発されたプログラムをHP-UXからLinuxへのポーティングする場合、どのように行えば効率的でしょうか?
また、注意する内容があれば教えて頂けないでしょうか?

ポーティング前のOSはHP-UX(詳細不明)
ポーティング後のOSはRedHat Enterprise Linux 5.5 (64bit)
C言語で開発されたプログラムは、ソケット通信でサーバ間通信を行う機能となります

Aベストアンサー

unix系(linux含む)でポーティングの際におもに注意すべき点は以下の3つです。
1.OS固有の問題
2.32ビット版と64ビット版との違い
3.エンディアンの違い(ビッグエンディアンとリトルエンディアン)
今回は、どちらも64ビットなので、2については考慮しません。
1についてですが、
私がHP-UXからsolarisへ移植したときに、シグナルの動作が異なるときが
ありました。今回もし、シグナルを使用しているようでしたら、動作が
多少異なる覚悟をしておいたほうがよいかと思います。
また、IPC(セマフォ、メッセージキュー、共有メモリ)を使う場合、
共有メモリは、多少調整を行った記憶があります。
(hp-ux=>solaris=>linuxの移植で、hp-ux=>solarisはOK、
solaris=>linuxで多少の調整が必要でした)
結論としては、もしシグナルおよびIPCを使う場合、100%そのまま使用可能とは
考えないほうが良いです。
2についてですが、
HP-UXはビッグエンディアンのCPU(sunのsparc系など)であり、
red-hatはリトルエンディアン(intel系)のCPUになります。
このため、受信した電文がバイナリデータの場合、そのデータの中身を見るのであれば、
ビッグエンディアンからリトルエンディアンへの変換が必要になります。
データの中身は一切参照しないか、文字データなら変換の必要はありません。
また、IPアドレスおよびポート番号などは
htonl,htonsなどにより適切なエンディアンにする必要があります。
(HP-UXはビッグエンディアンなのでこのような操作(エンディアン変換)をしなくても正しく動作しますが、red-hatに移植すると動作しなくなる可能性があります。)
エンディアンの問題はソケット通信のプログラムだけでなく、そのデータを使用するほかのプログラムにも影響します。
エンディアンの問題は非常に重要ですので、もし、エンディアンについての知識が浅い場合は、
ネットで調査および自分で簡単なテストプログラムを作成し、十分に理解されることをお勧めします。

参考URL:http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/socket.html

unix系(linux含む)でポーティングの際におもに注意すべき点は以下の3つです。
1.OS固有の問題
2.32ビット版と64ビット版との違い
3.エンディアンの違い(ビッグエンディアンとリトルエンディアン)
今回は、どちらも64ビットなので、2については考慮しません。
1についてですが、
私がHP-UXからsolarisへ移植したときに、シグナルの動作が異なるときが
ありました。今回もし、シグナルを使用しているようでしたら、動作が
多少異なる覚悟をしておいたほうがよいかと思います。
また、IP...続きを読む


人気Q&Aランキング