16進の数値をバイナリとしてファイルに書き込みたいのですが、
以下のようなプログラムで書き込んで、できたファイルを16進に
直して見てみると、
ff ff 00 00 aa ff 00 00
となっていて、途中に0000が入ってしまうのです。
16進に直して見たときに
ff ff aa ff cc 55 22 22
となるようにしたいのですが、どこがまちがっているのでしょうか?
int main(void){
long *i;
FILE *fp1;
fp1=fopen("test.dat","w");
i[0]=0xffff;
i[1]=0xffaa;
i[2]=0x55cc;
i[3]=0x2222;
fwrite(i,2,4,fp1));
fclose(fp1);
return 0;
}
No.3ベストアンサー
- 回答日時:
#2の方、おしい...
エンディアン(endian)はマシン(プロセッサ)アーキテクチャに依存します。
オペレーティングシステムに依存するわけではありません。
Windowsが動くマシンがIntelのPentiumというプロセッサで、x86と呼ばれるアーキテクチャがリトルエンディアンを採用しているからです。
質問者の方は、リトルエンディアンとかビッグエンディアンとかいうのはご存知ですかね?
でも、質問内容では気になさってないようですね。(自然とリトルエンディアンであることを受け入れていらっしゃる...)
では、質問の直接の回答を...
4バイトの型であるlongをご使用になっているのを、2バイトの型であるshortにします。
でも...このプログラムどうして動くのか不思議ですよ。
データを格納する配列 i[]は定義されていない、定義されているのはポインタの i ですから。(ポインタで定義されているiに対して、i[n]という使い方が誤っているというつもりではありません。Cの言語仕様はそれを認めています。)
動いているとすれば、自動変数であるポインタ i の初期化がされていないので、きっと不定のメモリに、0x0000ffffなどを書き込んで、しかも、ランタイムエラーとならない...ただの偶然ですよ。
ということで、目的とすることをなさるには、
unsigned short i[4];
<途中省略>
fwrite(&i[0], 2, 4, fp1);
とするのが正解です。
参考になれば。
No.2
- 回答日時:
こんちには、honiyonです。
以下の2点がミソです。
・long型は 4byte
・Windowsはスモールインディアン
Windowsはスモールインディアンなので、ファイルにデータを書き込むと上位ビットと下位ビットが逆になって保存されます。(スモールインディアンの詳細が知りたい場合は別途調べてみてください。)
つまり、0xffffというデータは、long型では、0000 ffff (4byte)と表せます。これをファイルに保存すると、上位ビットと下位ビットが逆転し、ffff 0000 というデータが保存されます。
もし、ffffだけ保存したいなら、2byteのデータ型を使うと良いと思います。
確かsmallint型が2byteだったような・・・ってsmallintってDelphiの型だったかな?(汗 ここは自身無しでお願いします(^^;
参考になれば幸いです(..
No.1
- 回答日時:
> 16進の数値をバイナリとしてファイルに書き込みたいのですが、
> 以下のようなプログラムで書き込んで、できたファイルを16進に
> 直して見てみると、
>
> ff ff 00 00 aa ff 00 00
>
> となっていて、途中に0000が入ってしまうのです。
> 16進に直して見たときに
>
> ff ff aa ff cc 55 22 22
>
> となるようにしたいのですが、どこがまちがっているのでしょうか?
逆質問です。
(1) ご使用の開発環境(コンパイラ)は何でしょうか?
(2) ご使用の環境でsizeof(long)はいくつになりますか?
(3) エンディアンの違いは考慮しなくてもよいのですか?
# C言語はよく知らないので、他の方のフォローを希望 (^人^;;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- 国産車 FFの 新型クラウンの 最小回転半径は 5.4m 4 2022/08/01 15:52
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- ヒーター・こたつ・ホットカーペット FF式暖房器などはシーズンオフには片付けますか。 今、ポット式ストーブ(煙突付き)を使ってますが、F 5 2022/11/28 08:18
- X(旧Twitter) Twitterについて質問。ぼくは前々から音ゲー垢を運用しているのですが、最近同じ音ゲーをしてるリア 1 2022/06/25 19:51
- C言語・C++・C# 100バイトのバイナリファイルを読み込んで別のファイルに書き込みたいのですが、型をどうすればいいのか 1 2022/11/03 17:11
- C言語・C++・C# C言語について教えて欲しいです。 ファイルの中身をコピーするプログラムを作ってます aというファイル 7 2022/11/03 19:21
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
EXCEL VBAでテキストファイルの...
-
画像の保存方法。
-
VBA バイナリ―から文字列にす...
-
バイナリファイルの比較につい...
-
MidB関数を使いたい!!
-
エクセルVBA 2千万行のCSVファ...
-
HDDのバイナリイメージの取得方...
-
MacからWinにファイルを添付す...
-
ビットマップファイル生成(C言...
-
ページ読み込み時に自動的にsub...
-
クリップボードからファイル名...
-
【MFC】CFileでSeekした位置か...
-
EOF
-
テキストファイルのデータから...
-
C言語の質問です。バイナリ形...
-
VBAでDOS-V形式のデータをエク...
-
【python】Excelファイルを読み...
-
バイナリ表記を表示するコード...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
EXCEL VBAでテキストファイルの...
-
バイナリエディタのつかいかた
-
ページ読み込み時に自動的にsub...
-
VBA バイナリ―から文字列にす...
-
エクセルVBA 2千万行のCSVファ...
-
エラー:ストリームの終わりを...
-
EOF
-
【python】Excelファイルを読み...
-
EXCEL VBAで、バイナリデータの...
-
入力ファイルをバイナリにする利点
-
DXFファイル用クラスライブラリ...
-
バイナリーデータの一部データ...
-
C言語とシリアル通信の送受信...
-
C言語の質問です。バイナリ形...
-
Javaでのエンディアン変換
-
24ビットのWaveデータの中身に...
-
bitmap画像の保存がうまくいき...
-
PHPのfgetcsvの処理容量について
おすすめ情報