• 締切済み

ビッグエンディアンをPCで処理する問題

ビッグエンディアンと指定されているバイナリファイルがあります。 これをPC(intel系,Linux or Windows)で処理する場合、エンディアンの変換が必要だろうと思います。具体的にはどのようにするのでしょうか。ネットでもダウンロードできそうですが。 変換コマンド -btol ファイル名(ビッグ)> ファイル名(リトル) という感じですかね。こんなものあるでしょうか。 購入したバイナリファイルなのですが、このご時勢たいていPCで処理するわけでしょうからリトルであってほしいものだと思いますが。 ところでMACはビッグとリトルのどっちなのでしょうか。

みんなの回答

  • aid-u
  • ベストアンサー率75% (22/29)
回答No.6

#2の方の言われるとおり、レイアウトが分からないと難しいでしょう。 2byteデータ変換メソッド、4byteデータ変換メソッド、8byteデータ変換メソッドはそれぞれ作成できます。 しかし、1レコードが4byteのデータのレイアウトが下記のように異なっている場合、変換結果は異なることになります。  1)1byteデータ 1byteデータ 2byteデータ  2)2byteデータ 2byteデータ このため、一般的にはレイアウトが分からないと変換は困難だと思います。

回答No.5

google で検索したらこのようなものが見つかりました. 使えるのではないでしょうか? エンディアン変換スクリプト http://mausam.hyarc.nagoya-u.ac.jp/~mhori/scripts/endian-exchange/

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.4

>>という風なプログラムだと思います。具体的なプログラムの書き方を教えて頂きたいのですが。 えーと、元々、購入したデータがリトルエンディアンだったとしても、バイナリファイルの場合にはレイアウトが分からないと処理できません。なので、イロイロなサイズのレコード(可変長)だった場合はもとより、固定長でも、いまのままでは処理できない可能性が大きいですね。 なお、データ変換プログラムは、そういう流れになります。その後のデータ処理のプログラムと比較して、かなり簡単な部類になると思いますので、こてしらべ的に自分で考えて(ネットで探して等)作られたほうがいいと思います。これが自力でできないなら、その後の処理プログラムも作れないと思います。 (また、バイナリエディタでファイルをながめていると、レイアウトはだいたい予想できることも多いです) なお、「ビッグ-->リトルの変換さえできればいい」ということなら、Perlのようなスクリプト言語での処理も可能です。 C言語で作るよりもお手軽なので、私は、この手の処理が必要な場合、Perlを使っています。 ちなみにMacは、CPUが68系(モトローラ)のモデルはビッグで、86系(インテル)のモデルはリトルです。個人的には、68系が直交性あるマシン語セットで好きだったんですけどね。

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.3

ANo.2さんの言われるとおり、レイアウトが分からないと難しいです。でも、それを質問者さんはPCで処理したいと思われているのでしょうから、レイアウトを知ることは可能なのではないですか? レイアウトさえわかれば、あとは、short,int,long等のバイトを入れ替える関数を呼び出しながらデータを変換して書き出すプログラムを書けばOKです。charやstringはそのまま書き出します。 C言語では、参照URLにあるような関数を呼び出せば、変換できます。なおネットのデータはビッグエンディアンで流れています。

参考URL:
http://wisdom.sakura.ne.jp/system/winapi/winsock/winSock4.html
skmsk19410
質問者

お礼

ありがとうございます。データの種類と個数が分かれば、サイズ×個数でファイルサイズが計算でき、これが実際のファイルサイズと一致すれば処理できると思います。実際には様々なサイズのファイルが混入されているバイナリファイルだったらどうするのかという問題があるように思いますが、どうしたらよいのでしょうか。 また、プログラムの構造としては、 1.ファイルを開く(読み込み、書き込み) 2.変数にデータを読み込む 3.変数変換関数を通す(ntohs(),ntohl(); ビッグ→リトル) 4.変換された変数を書き込みファイルに出力 5. 2,3,4をファイル終了まで繰り返す 6.ファイルを閉じる という風なプログラムだと思います。具体的なプログラムの書き方を教えて頂きたいのですが。C言語のテキストに載ってそうですけど。私は以前フォートランでやったことはあるのですが。

  • wolf03
  • ベストアンサー率22% (241/1086)
回答No.2

データレイアウトが分からない以上、エンディアン変換は不可能です。 数値は型により1~8byteの物があり2byte以上の物を変換、さらに文字は変換しません。 自力でレイアウトに合わせて変換するプログラムを作りましょう。

skmsk19410
質問者

お礼

回答、ありがとうございました。ご指摘のことはデータのタイプとかサイズによっていろいろなので普遍的な変換方法はない、ということでしょうか。問題となっているデータは文字ではなく、数字です。私の考えでは8ビットだったら、ABCDEFGH→HGFEDCBAとすれば反転が完了するのではないかということですが、違うでしょうか。±で問題が発生するかも。分かりませんが。ネット上ではエンディアン変換ツールもあるみたいですが、使えるのかなと思案しています。

回答No.1

興味深い話題ですね. 以下の URL が参考になりそうです. 「ビッグエンディアンとリトルエンディアンの意味とその変換方法」 http://digital.ni.com/public.nsf/allkb/008AB70CC5F0EB6B862570800029364E 「[tips]ビッグエンディアンとリトルエンディアン」 http://son-son.sakura.ne.jp/programming/tips.html

関連するQ&A

  • エンディアンを知るには

    リトルエンディアンのマシンで作ったバイナリデータをいろいろなマシンで読み込みたいのですが、一部がビッグエンディアンなので変換の必要があります。ただ、ソースを共通にしたいのでエンディアンを知ることができるマクロの値でエンディアンの違いの処理を行いたいのですが、どのようなマクロを使えばいいのでしょうか?

  • 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
  • エンディアンについて

    すみません。 教えてください。 リトルエンディアンからビッグエンディアンに変換しないと いけません。 エンディアンについては勉強したつもりですが、 どうしてもわからないことがあります。 ご存知の方、教えていただせんか? 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バイト)などは 意識せず、そのままバイナリ出力しても、ビックエンディアンで出力されると いうことでよろしいでしょうか? そうなると、エンディアンってなんだんだ???と混乱しています。 わかりにくい説明で大変申し訳ござませんが、 よろしくお願いいたします。

  • リトルエンディアン、ビッグエンディアンについて

    リトルエンディアン、ビッグエンディアンについて 質問があります。 (1)簡単にそのPCがリトルエンディアンなのか、ビッグエンディアン  なのか、分かる方法はありますか?  簡単なCプログラムを書いてメモリ状態をダンプするのが、  一番早いのでしょうか?  それとも、Intel系?モントローラ系?CPUにはあまり詳しくないので、  分かりませんが、これらのどちらかに属していれば決められるので  しょうか?ほかの系とかあるのかな・・・ (2)ネットワークプログラミングをするときに、ビッグエンディアンの  マシンからデータを送出する場合には、htonlなどの関数を使用しなく  ても問題ありませんでしょうか?(ネットワークバイトオーダが  ビックエンディアンであるため)

  • エンディアンの問題

    バイナリファイルの記憶の仕方にビッグエンディアンとリトルエンディアンがあります。たとえば16ビットのうちの前半の8ビットと後半の8ビットが逆になっていることだと思います。そこで質問ですが、 ○なぜ、そういう風に分かれているのか。 ○この問題が顕在化するのはどのような場合か。 ○その解決方法は? という点について教えて頂きたいのですが。私の記憶では例えばUnixとDOS(Windows)で逆である(どちらがどちらなのか分かりませんが)ということでした。もし、そのことが問題であれば、解決法としてはとにかく反転すればよいということになるかもしれません。簡易ソフトなどもあるようですし、自分でプログラムを書いたこともあります。もちろんどちらが本当に正しいのか判別できなければなりませんが。

  • ビックエンディアンで動作するPC

    バイトオーダでビックエンディアンとリトルエンディアンがあるのは知っていますが、 実際にビックエンディアンで動作するPCを見たことがありません。 (といいますかビックエンディアンで動作しているか分かりません) 秋葉原等でビックエンディアンで動作するPC(CPU・マザーボード)は買うことはできるのでしょうか? その場合のOS、Linuxになると思いますがディトリビューションどれがよいのでしょうか? クロスコンパイル環境に興味があり、エンディアンが違うPCでも動作するプログラムを 書いてみたいと興味があり質問させていただきました。

  • 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
  • ビッグ/リトルエンディアンについて

    現在、ワークステーション(SPARC+Soralis)上でFortranで書かれたプログラムがあります。 それをPC(x86+WindowsXP)の環境へ移行した所、Fortran記録(バイナリ)の内容が、CPUアーキテクチャの絡みでビックエンディアン/リトルエンディアンの問題が発生し、苦労しています。 Windows側で使用しているFortranコンパイラは「富士通 Fortran&C Packege V4.0」です。 PC側でまともにワークステーションのバイナリファイルを読みたいのです。 どなたか対策をご存じの方がいらっしゃいましたら、ぜひ、ご教授ください。 よろしくお願いいたします。

  • ビッグエンディアン環境で動作していたソフトウェア(暗号処理等を含む)を

    ビッグエンディアン環境で動作していたソフトウェア(暗号処理等を含む)を急遽リトルエンディアンの環境へ移植することになりました(コンパイラ等もリトルエンディアン用)。 具体的には、SHA、RSA、DHなどのアルゴリズムを含み、入力データ(128Byte程度)に対する電子署名の生成や検証を行うソフトウェアです。 ここで、移植するために修正すべき箇所を特定したいのですが、どのようにすれば良いか教えていただけないでしょうか? (ビット演算や型変換なども多用しています) よろしくお願いします。

  • エンディアン: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.同様の問題で、ビッグエンディアンの場合は、どうすればよいかも、ご教示下さい。 よろしくお願いします。

専門家に質問してみよう