プロが教えるわが家の防犯対策術!

バイナリファイルに16ビットで表現された正数が順番に格納されています.
もし(10進数で)1,10,15の値がこの順番で格納されていたら,
Stirlingではどのように表示されるのでしょうか?


ファイルからこのデータx個を配列dataに読み込むために
unsigned short data[x];
fseek(fp, 0L, SEEK_SET); /* ファイルポインタを先頭へ */
fread(data, 2, x, fp); /* 2バイトずつx個読み込む */
としたのですが,
このdata[i]に正しく格納されているか確認したいためです.

Stirlingで「00 01 00 0A 00 0F」となっていれば,
  data[0]:1,data[1]:10,data[2]:15
になると思ったのですが,
  data[0]:256,data[1]:2560,data[2]:3840
になりました.
ちなみに,256,2560,3840は16進では100,A00,F00です.

どこか間違っているのでしょうか?
長くなりましたが,どなたかご教授ください.

A 回答 (4件)

下記のご質問については、すべて「はい」だと思います。


余談ですが、2560や0A00と表記したとき左側が上位桁ですよね?
エディタでは左側に若いアドレス(のデータ)を表示します。
そのデータが16進2桁なのでその2桁は左側が上位桁になります。
だから、あんまり不思議はないのかも・・
(若いアドレスに下位桁がくるので)

> 16ビット正数が順番に格納されている場合,
> このデータを取り出すためのプログラムは
> fread(data, 2, x, fp);
> で合っているのでしょうか?

> またファイルの中身をStirlingで編集するときは,
> 2バイトの上位と下位を入れ替えて書き込まなければならないということでしょうか?

> では,data[0]:1,data[1]:10,data[2]:15にするためには,
> 「01 00 0A 00 0F 00」とすればよいわけですね?
    • good
    • 0
この回答へのお礼

おかげさまで分からなかったことがすべて解決できました.
ありがとうございました.

お礼日時:2008/11/02 19:06

リトルエンディアンでは下位バイトが若いアドレスに来ます。



エンディアン - Wikipedia
http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3% …

エンディアンはOSというよりもプロセッサに依存します。
    • good
    • 0
この回答へのお礼

回答ありがとうございます.

お礼日時:2008/11/01 12:38

> data[0]:1,data[1]:10,data[2]:15


> になるはずが,なぜ
> data[0]:256,data[1]:2560,data[2]:3840になってしまうのでしょうか?

data[0]:256,data[1]:2560,data[2]:3840
256,2560,3840は16進では100,A00,F00
ということですから先頭に0を付加すると
0100,0A00,0F00 となります。(2バイト X 3文字 = 6バイト)
これをファイルに記録すると Stirlingで見たとおり
「00 01 00 0A 00 0F」と保存されるのです。(2バイトの上位/下位が入れ替わる)
これは MS-DOS/Windows系の仕様なのでしょう。MAC-OSは違ったと思います。
分かりにくいけど歴史といきさつがあったのでしょうね。
Stirling、使ったことがありませんが良さそうなのでこの機会に使ってみます。ありがとうございました

この回答への補足

16ビット正数が順番に格納されている場合,
このデータを取り出すためのプログラムは
fread(data, 2, x, fp);
で合っているのでしょうか?

またファイルの中身をStirlingで編集するときは,
2バイトの上位と下位を入れ替えて書き込まなければならないということでしょうか?

補足日時:2008/11/01 12:33
    • good
    • 0
この回答へのお礼

回答ありがとうございます.

では,data[0]:1,data[1]:10,data[2]:15にするためには,
「01 00 0A 00 0F 00」とすればよいわけですね?

お礼日時:2008/11/01 12:17

どこにも間違いはないと思います。


ファイルには unsigned short の下位バイト、上位バイトの順で
保存されるのでそうなると思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます.

data[0]:1,data[1]:10,data[2]:15
になるはずが,なぜ
data[0]:256,data[1]:2560,data[2]:3840になってしまうのでしょうか?

お礼日時:2008/10/31 16:24

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