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;
こんな感じに。。。
大きい値は...扱わないようにします。。
|