• ベストアンサー

Endianについて

Endianというキーワードでいろいろ探してみたのですが、どこをみても「2バイト以上のデータ量を持つ数値データを記録したり転送するときには1バイトごとに分割する」と書いてあります、2バイト以上というのは、たとえば、int型(int a=777)のような変数ですよね!? これを別のPCに転送する際に1バイトずつしかデータが転送されないというのが疑問でなりません。 ネットでは、パケットごとにデータを転送しているのではないでしょうか?

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

  • ベストアンサー
  • elttac
  • ベストアンサー率70% (592/839)
回答No.1

 エンディアンには,リトルエンディアンとビッグエンディアンの 2 種類があります。これは,2 バイト以上の数値データを記録・転送するときの「各バイトの並べ方」です。  たとえば,2 バイトの数値 0x0102(10 進数で 258)を考えましょう。ビッグエンディアンでは,この格納順は正順,つまり,   01 02 になります。一方,リトルエンディアンでは,格納順は逆順,つまり,   02 01 になります。リトルエンディアン(の並び)で記録された「02 01」をビッグエンディアンとして読み出すと 0x0201(513)になってしまいます。逆も同様です。ですから,数値がどちらのエンディアンで記録されているかが重要なのです。  ちなみに,Pentium などはリトルエンディアン,PowerPC などはビッグエンディアンの CPU です。  「e-words」の「エンディアン」の項目も参照ください。

参考URL:
http://e-words.jp/
全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.3

実際にどうやってデータを送っているかによりますが、 物理的には1ビット単位で送っているのが多いように思います。 シリアルな通信はビット単位です。 RS-232C,USB,IEEE1394(iLink),Ethernetはそうです。 そういう理由もあって、通信速度はバイトでなくビットで表現します。 bps(Bit Per Second) また、パラレルで送っている場合でも、実はEndianは関係あります。 結局はメモリ上でどういう順で入っているかという問題で、途中経路とは別問題です。

hourensou2003
質問者

お礼

elttacさん、Tacosanさん、terrar5さん、ありがとうございました。確かに論理的にはパケットでも実際は1バイトずつですよね(;^_^A

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

確かに論理的にはパケットごとに転送しているのですが, 物理的にはもっと小さい単位でしかデータを送ることができません. そもそも twisted-pair cable は 8本 (4対) しか電線がないので, 1個のパケットを一度に送るのは現在の技術では無理です. 10BASE-T なら一度に 1ビット, 1000BASE-T でも 4対全部使って ようやく一度に 1バイトしか送れません. ちなみにネットワーク上ではビッグエンディアンでデータを送ることに なっていますので, ビッグエンディアンのことをネットワークエンディアンとも 言ったりします.

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Endianについて パート2

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

  • エンディアンについて

    すみません。 教えてください。 リトルエンディアンからビッグエンディアンに変換しないと いけません。 エンディアンについては勉強したつもりですが、 どうしてもわからないことがあります。 ご存知の方、教えていただせんか? CPUはリトルです。 まず、エンディアンの違いについては 以下のように認識しています。 x = 0xAABBCCDD メモリの配置方法が、 トリルだと DD CC BB AA ビックだと AA BB CC DD だと思っています。32ビットの場合です。 で、これを変換するには、htonlで変換可能だと思っっています。 (試したところ可能でした) で次に、32ビットを超えるデータ、たとえば100バイトとかを mallocにして変数に代入しました。 この時はエンディアン変換(ファイルに出力する際)は必要ないのでしょうか? 試しに出力すると、 x = 0x AA BB CC DD EE FF GG ・・・・・・ZZ (100バイトと仮定) バイナリでの出力結果は AA BB CC DD EE FF GG ・・・・・となっていました。 私の認識だと、本CPUはリトルエンディアンのため、 ZZ ・・・・・・・・ DD CC BB AA (四バイトずつ反転しているデータ) が出力されるものと思っていました。(反転してメモリに格納されるため) リトル/ビックを意識しないといけないのは、 2バイトや4バイトの時のみで、それを超える大きなデータ(100バイト)などは 意識せず、そのままバイナリ出力しても、ビックエンディアンで出力されると いうことでよろしいでしょうか? そうなると、エンディアンってなんだんだ???と混乱しています。 わかりにくい説明で大変申し訳ござませんが、 よろしくお願いいたします。

  • エンディアン変換を高速に行うには?

    こんばんわ, 現在Redhat Linux 9の環境でCの勉強をしています。 ファイルから読み取ったデータがBIGENDIANの形なので,それをLITTILE ENDIANになおして使用したいのですが,できるだけ高速に変換するアルゴリズムを考えています。 変換するデータは1byte(これは関係なし),2byte,4byte,でそれぞれunsignedのshortintとint型です。 とにかくべた書きでもいいのですが,どのようにすれば高速に変換できるのでしょうか。 glib.hやhtonlなどを使用する方法などよろしくお願いします。

  • Javaでのエンディアン変換

    こんばんは☆ Javaでのエンディアン変換をご教授ください。 ファイルを読み込み、ソケット通信でサーバへデータ送信しています。 リトルエンディアンで送らなければいけないのですが、 Javaはプラットフォーム問わずにビッグエンディアンでメモリに格納するとありました。 そこで、バイトオーダーをしようと思い、 stirlingというバイナリエディタでバイナリファイルを作成して以下の2点で試しました。 <バイナリファイル構造体> struct stest { LONG l1; LONG l2; LONG l3; LONG l4; }; <バイナリデータ(数値)> 1234 (010000020000030000040000)←バイナリエディタで見たとき <テスト1結果> ・・・new InputStreamReader(in, "UnicodeLittle"); >1000200030004000 <テスト2結果> ByteBuffer buffer = ByteBuffer.wrap(bt); buffer.order(ByteOrder.LITTLE_ENDIAN); buffer.get(); >1000200030004000 これはリトルエンディアンなのでしょうか? どちらも、 Javaで読み込み時にエンディアン指定しない時と出力結果に違いがありませんでした。 なぜでしょうか? ちなみに、データ型を意識せずに変換したいです。 色々と調べたのですが、良く分かりません。 どなたかご教授お願いいたしますm(_ _)m

    • ベストアンサー
    • Java
  • エンディアン:2バイトのデータをShort intにしたいのですが?

    1.Intelの CPU リトルエンディアンでの、問題です。 バイナリファイルをバイト単位で読込み、これを16ビットの整数にしたいのですが、以下のようにコーディングしましたが、うまくいきません。解決方法をご教示下さい。 char s[2]; short int x;   // 16ビットの整数です // s[0] s[1]に、データを読み込みます。 x = (short)(s[0] + 256 * s[1]); 2.同様の問題で、ビッグエンディアンの場合は、どうすればよいかも、ご教示下さい。 よろしくお願いします。

  • JAVAのdouble型情報をリトルエンディアンでバイナリへ出力の方法

    JAVAでdouble型の情報をリトルエンディアンでバイナリとして出力する方法を教えてください。 現在、java.io.DataOutputStreamを使用し、writeDoubleで出力していますが、ビックエンディアンとしてしか無理でした。 読み込むのはテキスト型で出力がバイナリ。 現在のソースの簡易フローチャートを書いて置きます。 START ↓ テキストファイルから特定の文字列を取得する(1 , 7 , 5.5等) ↓ 取得した文字列をそれぞれ対応の型に変換する int top = Integer.parseInt("1"); int sub = Integer.parseInt("7"); double miks = Double.parseDouble("5.5"); ↓ バイナリのフォーマットに合わせて出力する int型は4バイトでビックエンディアン。 double型は8バイトでリトルエンディアン。 例えば、デフォルトのビックエンディアンで出力した時、数字の1は 00 00 00 01 になりますが、 リトルエンディアンで出力した時は、 01 00 00 00 になると思います。 変換するタイミングとしては、書き込む時にオリジナル機能(メソッド)で書き込むデータ(int型やdouble型)とビックかリトルを指定して、バイナリに出来るものを探しています。 PS 現在の質問はソースを上げるのが一番とは思いますが、社外秘のソースなので、公開することは出来ません。 PPS 私の質問に対する質問があれば、より詳細に答えていくつもりです。 以上、宜しいお願い致します。

    • ベストアンサー
    • Java
  • ソケット通信時のエンディアン変換について

    現在、WindowsとLinux(Unix)でソケット通信を行い、データをやり取りするプログラムを作成しています。 ソースコードやコンパイルの環境は、 Windows側(Windows7):C言語(Windowsプログラミング)、VisualStudio2013でビルド&実行 Linux側:C++、g++(Cygwinを使用) 送信したいデータは、 Windows→Linuxはfloat型の配列に保持しているデータ Linux→Windowsはconst string型のデータ です。 (1)例として、送りたいfloatのデータが float a[3]; a[0] = 1.1; a[1]=2.2; a[2]=3.3 であるとします。(実際には負の値も考えられます) floatは4バイトなので、各要素でエンディアンを変えてa[0]からa[3]のデータを一括してLinux側にsendしたいと考えているのですが、どのように実装すればよいかが分かりません。 for(int i=0; i<3; i++){ //htonl(*(long*)&a[i]);でエンディアンを変換 //変換したものを何かしらの変数に保存 } //保存しておいたものをsend という大まかな流れだけは考えているのですが、実際どう実装していけばいいのか分からず困っています。 (2)(1)のデータを受信した側で元のfloatのデータに直す方法 (3)Linux→Windowsではstring型のデータを送りたいのですが、c_strを用いてchar型に変換したものをそのままsendしてよいのでしょうか? (char型は1バイトなのでエンディアンを変換する操作は必要はないでしょうか?) もし分かることがありましたら、教えていただけると助かります。 よろしくお願いします。

  • 32bitデータの取得マクロ関数

    int data[2]; // 64bit分のグローバルデータ /* 関数マクロ */ GET_DATA(tmp) \ do{\ /* int test = 0; */ memcpy(&tmp, &data[1] , 32) \ while(0) 質問は2つあります。 (1)64bitのデータから下位32bit分のデータの取得用の関数 マクロを教えてください。エンディアンはビッグエンディアンです 上記のように、マクロ関数に引数を渡して、データをコピーすることは可能ですか? (2)基本的な質問ですが、マクロ関数内で変数定義は可能ですか? よろしくお願いします。

  • データ通信とパケット通信

    携帯電話は第2世代は「データ通信」 第3世代は「パケット通信」ですが、 データ通信とパケット通信の違いは何でしょうか? データ通信 ⇒ データを分割しないで転送する通信 パケット通信⇒ データを一定の大きさに分割して転送する通信 と認識していますが間違いないでしょうか?

  • USB-CDC通信する場合のパケットサイズについて

    表題の件ですが、、、 ある機器とUSBで接続すると、デバイスマネージャとしては、「COMポート」と認識します。 この状態で、COM通信を行いたいのですが、、、、 1パケットあたりの最大サイズはどうなるのでしょうか? COMであれば、上限はバッファで割り当てられたサイズ(機器/PCで)になるのかと思うのですが、、、 PC:Windows7 機器:LinuxOS(組み込み) CDC Driver:Windows標準 、、、機器側は、標準と聞いていますが不明。。(ttyGSと書いてあった) 自分で試している分では、なぜか512Byte以上のデータを転送(WriteFile)をすると、受け取り側(機器)で512Byte以上読めない(ReadFileで読み出せない)ように見えます。 USB-CDCの場合は、1パケットの上限が決まっていたりしますか? (10MB程度のデータ転送を行う必要も有り、1パケットあたりの転送量が少ないと転送効率が悪いと思うので、改善したいのが目的です。ヘッダが20Byteは必要なので、、、) COM通信に見えて、USBのBulk転送の制約があるのかな・・???? 知っている人がいましたら、ご教授願いたいと思います。 申し訳ありませんが、協力を宜しくお願いします。 一部のHPでは、USBのBluk転送が1パケット512Byteと書いてあるところもありました。