トップページ > 記事閲覧
FileRead_read関数について
名前:LR 日時: 2015/06/21 01:16

はじめまして。 DXライブラリ Ver 3.14d VC版において、 FileRead_read関数で、第二引数のReadSizeに値を入力すると、ちゃんとそのバイト数だけBufferのアドレスに読み込めるんですが、値が反転します。 どういう事かと言いますと、読み込むファイルに 0xABCDEFと書いていて、 FileRead_read(&Buffer, 3, FileHandle); とすると、 Bufferの値が0xEFCDABとなります。 バグでしょうか、仕様でしょうか。
メンテ

Page: 1 |

Re: FileRead_read関数について ( No.1 )
名前:管理人 日時:2015/06/21 04:41

仕様となります Windows の環境は一般的にバイトオーダがリトルエンディアンなので、int 型変数等の4バイトの変数は、 メモリ内では以下のように格納されています 例:int型の変数に 0x01234567 という値が代入されていた場合 0バイト目 : int型変数の 0bit 〜 7bit が格納されている、0x01234567 の値の「67」の部分 1バイト目 : int型変数の 8bit 〜 15bit が格納されている、0x01234567 の値の「45」の部分 2バイト目 : int型変数の 16bit 〜 23bit が格納されている、0x01234567 の値の「23」の部分 3バイト目 : int型変数の 24bit 〜 31bit が格納されている、0x01234567 の値の「01」の部分 なので、バイナリファイルに 0バイト目に 0xAB 1バイト目に 0xCD 2バイト目に 0xEF と書いた場合は、int型変数に読み込むと 0xEFCDAB となるわけです( 低い桁が若いメモリアドレスに代入されるため ) 「バイトオーダ」 「エンディアン」 「リトルエンディアン ビッグエンディアン」 等のキーワードでネット検索していただければエンディアンに関する情報が得られますので よろしければ検索してみてください
メンテ
Re: FileRead_read関数について ( No.2 )
名前:LR 日時:2015/06/21 17:35

朝早くから回答ありがとうございます。 仕様だったのですね。 普段そのようなことはあまり意識しないので... では、バイナリファイルに書き込んだ順に変数に書き込みたいときはどのようにすればよいのでしょうか?
メンテ
Re: FileRead_read関数について ( No.3 )
名前:Will 日時:2015/06/22 10:01

> では、バイナリファイルに書き込んだ順に変数に書き込みたいときはどのようにすればよいのでしょうか? エンディアン変換を行ってから、書き込めばよいです。 変換を行う関数は、ググればいくらでもヒットしますので、好きなのを選んでください。 ただし、読み込むときに、エンディアン逆変換を行わなければ、正しい値にならないことを忘れないで下さい。 もう一つの方法は、全てchar(1バイト)にすればエンディアンの影響はなくなりますが、大きい値を扱いづらくなります。
メンテ
Re: FileRead_read関数について ( No.4 )
名前:LR(解決) 日時:2015/06/22 22:38

そうですね。 1バイトずつ読み込んでみます。 unsigned char Temp1, Temp2; FileRead_read(&Temp1, 1, FileHandle); FileRead_read(&Temp2, 1, FileHandle); Buffer = (Temp1 << 8) + Temp2; こんな感じに。。。 大きい値は...扱わないようにします。。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存