現在、C言語で、int,float等で格納されたファイルを
読もうとしていますが、作成されたマシンと、処理をする
マシンの違いにより、「endian」の違いの問題が生じて
います。
つまり、もともとのデータは、big endian のマシンで記述されて
いるのに対し、処理を行おうとするマシンでは、small endian
(名前の呼び方は確かではないですが・・)で、処理を行っています。
少し、調査したところ、2byteデータの場合は、最初の1byte・後の1byte
を入れ替えると変換できるようですね。(これは、本当ですか?)
4byteデータの場合は、どうなるのでしょうか?
2byteデータのように、何かバイト位置を入れ替えるとできるのでしょうか?
それとも、何か別なのでしょうか?
よろしくお願いします。
=====
Kazuhito Ichii
ic...@system.eps.nagoya-u.ac.jp
> 少し、調査したところ、2byteデータの場合は、最初の1byte・後の1byte
> を入れ替えると変換できるようですね。(これは、本当ですか?)
はい (エンディアンの問題だけについて言えば).
計算機 (CPU/ライブラリ) によって浮動小数点のフォーマット
も違う可能性があるのですが,可能性は低いでしょう.
# 画像データでもなければビットオーダーは気にしなくても良
# いんだよね?
> 4byteデータの場合は、どうなるのでしょうか?
最初と最後の各 1 バイト,真ん中の 2 バイトをそれぞれ
入れ替えれば良いです.
自分で入れ替えてもよいのですが,
2 バイトの場合 ntohs/htons
4 バイトの場合 ntohl/htonl
の関数/マクロを使う方が良いでしょう.
インクルードすべきヘッダーファイルはシステムによって違う
ので自分で調べてください.
関数/マクロの意味は,計算機上のバイトオーダーとネットワー
クを流れるデータのオーダーを変換するという意味です (ネット
ワークバイトオーダーはビッグエンディアンと同じ).
今回は運良く出力側がビッグエンディアンなので,入力側のリ
トルエンディアンの計算機のアプリケーションで ntohs/ntohl
を使うだけで大丈夫なはずです.
出力側でも htons/htonl を使うようにしておけば,出力側をリ
トルエンディアンの計算機に移植しても OK (ファイルに出力さ
れるデータは常に同じ).
----
Hisao Aoyama 青山 尚夫
ASTEC, Inc. (株)アステック
aoy...@astec.co.jp
呼び名はLittle Endianですね。
こんな風になります。
Big Endian Little Endian
2byte:AB BA
4byte:ABCD DCBA
上の書き方でちゃんと見えるかな?
間島ともうします。ちゃちゃを入れさせていただきます。
endian という単語があるわけではありません。
正しくは、 Bigendian(おっきい方がおしりだと思う人)と Littleendian
(ちっちゃい方がおしりだと思う人)という意味です。
スウィフトのガリバー旅行記が語源になってます。
こういう場合は、「Byte Order」の違いの問題、というとスッキリすると思
います。
>> endian という単語があるわけではありません。
>> 正しくは、 Bigendian(おっきい方がおしりだと思う人)と Littleendian
>> (ちっちゃい方がおしりだと思う人)という意味です。
ゆでたまごの殻をどっちからむくかの問題で、おしりは関係ないと思う…
http://www.litrix.com/gulliver/gulli006.htm
によると、
And so unmeasurable is the ambition of princes, that he seemed to
think of nothing less than reducing the whole empire of Blefuscu
into a province, and governing it by a Viceroy; of destroying the
Big-Endian exiles, and compelling that people to break the smaller
end of their eggs, by which he would remain the sole monarch of the
whole world.
という具合に、SwiftはPart IのChapter 4、5、7で「Big-Endian」
という言葉を計6回使っています。
(little endianっていうのは全文検索しても見つからなかった)
http://wombat.doc.ic.ac.uk/foldoc/index.html
によると、
-endian
<data, architecture> The ordering of bytes in a multi-byte number.
The term comes from Swift's "Gulliver's Travels" via the famous
paper "On Holy Wars and a Plea for Peace" by Danny Cohen, USC/ISI
IEN 137, 1980-04-01.
The Lilliputians, being very small, had correspondingly small
political problems. The Big-Endian and Little-Endian parties debated
over whether soft-boiled eggs should be opened at the big end or the
little end.
See big-endian, little-endian, middle-endian, holy wars,
NUXI problem, swab.
だそうで、「On Holy…」という文でbyte orderの種類を指定する方法として
「Big-Endian」「Little-Endian」という用法が確立されたようです。
実際には
http://www.rdrop.com/‾cary/html/endian_faq.html
のDAV's Endian FAQに多く見られるように、ハイフンなしの「big endian」
「little endian」も使われていますし、「endian」だけでも使われることが
あります。(ちなみに「On Holy…」の全文はこのFAQに収録されてます)
--
新崎@東大院総合
ara...@mns2.c.u-tokyo.ac.jp
間島ともうします。
知ったかぶってしまいました。
>http://www.litrix.com/gulliver/gulli006.htm
>によると、
>
> And so unmeasurable is the ambition of princes, that he seemed to
> think of nothing less than reducing the whole empire of Blefuscu
> into a province, and governing it by a Viceroy; of destroying the
> Big-Endian exiles, and compelling that people to break the smaller
> end of their eggs, by which he would remain the sole monarch of the
> whole world.
英語も不自由な人なので、某翻訳ソフトで翻訳してみました。
従って、王子 彼が、州にBlefuscuの全体の帝国を減らすより、総督によって
それを制御するより何についても少なく考えないようであった の野心が測定
できません;ビッグ-Endian亡命者を破壊し、彼が全体の世界の唯一の君主で
あり続けてそれらの卵のより小さい終わりを壊すことをその人々に強制する間
に。
なんだかよくわかりませんでした。文が長すぎるようですね。
>実際には
>http://www.rdrop.com/~cary/html/endian_faq.html
>のDAV's Endian FAQに多く見られるように、ハイフンなしの「big endian」
>「little endian」も使われていますし、「endian」だけでも使われることが
>あります。(ちなみに「On Holy…」の全文はこのFAQに収録されてます)
あまり気にしなくてよい、ということでしょうか。