バイナリファイルにデータを書き込むプログラムを作りたいと思っています。実は、Standard MIDI Fileのバイナリファイルを作りたいんです。
SMFについては、今まで、直接バイナリエディタで開き、16進数の数字をいじくって、データ書き換えたりしてたので直接バイナリファイルに16進数での数字を書きたいんです。
たとえば、テキストファイルに903C408360803C0000みたいに吐き出すプログラムでは、バイナリファイルに書き出してからバイナリエディタで開くと
こいつがさらに16進数に変換されてしまいますよね?
そうならないようにするにはどうやればいいんですか?
No.5ベストアンサー
- 回答日時:
こんにちは。
itohhといいます。>このプログラムでは、903C408360803C0000のみを出力してますよね。
これは、あくまでも例ですから...
実際は、どのようなバイナリデータを設定したいのかによってmemcpyになるか、あるいは
その他の設定方法になるかは、yabuchanchanさんのプログラムによって変わってきます。
場合によっては、この関数(fncXtoA)を使わずに2文字(1バイト)づつ設定していくほうが
効率がいいかもしれませんし、いくつかのパターンがあるだけで条件によってバイナリデータ
を替えるだけならば、if文などでmemcpyを選択しても良いと思います。
yabuchanchanさんのプログラムにあった方法にこのサンプルを加工して使ってください。
配列を用意してそこに2文字ずつ入れて行きました。
そうするとうまくいきました。
毎回いろいろな事教えて頂いてありがとうございます。
また、わからないことあったらよろしくお願いいたします。
No.4
- 回答日時:
こんにちは。
itohhといいます。>0x90と書き出せばそれは、もしテキストファイルで開けると、
>文字化けしてしまうということなんですか?
ACSII文字コードというのをご存じですか?
”0”文字->16進数では30となります。
”9”文字->16進数では39となります。
”A”文字->16進数では41となります。
”F”文字->16進数では46となります。
ですから、0x90は文字としては”・”と表示されてしまうんです。
バイナリエディタで表示すると0x90と表示されるはずです。
バイナリで出力するということはそういうことです。
サンプルを下記に載せておきます。参考にしてください。
判らないところがあれば補足してください。
ただし、当方、Windowsですので、Mac特有のことはアドバイスできません。
(インデントするために行の先頭に全角スペースを入れています。)
#include <memory.h>
#include <stdio.h>
int fncXtoA(char *des, char *Hex )
{
int i=0;
char buf=0x00;
/* 2文字分を1バイトに変換する。 */
for( i=0; i<2; i++)
{
/* 4ビット左にシフトさせる */
buf <<= i*4;
if(des[i] >= '0' && des[i] <= '9' )
{
buf += des[i] & 0x0f;
}
else if(des[i] >= 'A' && des[i] <= 'F')
{
buf += des[i] - 0x37;
}
}
memcpy( Hex, &buf, 1 );
return 0;
}
int main()
{
char wBuf[100];
char wItem[100];
int i=0;
int j=0;
int Count=0;
FILE *fout;
int num=0;
memset( wBuf, 0x00, sizeof(wBuf) );
memset( wItem, 0x00, sizeof(wItem) );
memcpy( wItem,"903C408360803C0000", 18 );
/* wItem内の文字列分ループする */
for(i=0; wItem[i] != 0x00; i+=2,j++ )
{
fncXtoA( &wItem[i], &wBuf[j] );
Count++;
}
/* ファイルにバイナリ出力する */
if( (fout = fopen( "test.out", "w+b" )) != NULL )
{
num = fwrite( wBuf, sizeof( char ), Count, fout );
fclose( fout );
}
return 0;
}
この回答への補足
こんにちは。
このプログラムでは、903C408360803C0000のみを出力してますよね。
ここに、条件によって違うものを出力させたいんですけど、その時に
条件文はどのようにこのプログラムに合体させたらいいのかが、よく
分かんないです。
やっぱり、memcpyをいじるんですか?
No.3
- 回答日時:
itohh氏の回答へのお礼をみていて思ったのですが…
コレ、「90」の十六進数をテキストに出力したいんじゃなくて
書き出したファイルをバイナリエディタで開いたときに
1バイト目の値が「90」になるように書き出したいんではないですか?
で、そう仮定して書きます。
よく知らないので自信がありませんが、こういうときは
"stdio.h"内のfwrite関数かと思います。
書式はfwrite(const void* buf, size_t size, size_t n, FILE* fo);
でbufの内容をsizeバイトずつn個、foで開いたファイルに書き出します。
これで、このときbufに903C408360803C0000(十六進数で一バイトずつ)を
書き込んでおけば、狙ったとおりに出力されるんではないかと。
もっと効率のいい書き方がありそうですが…
この回答への補足
>コレ、「90」の十六進数をテキストに出力したいんじゃなくて
>書き出したファイルをバイナリエディタで開いたときに
>1バイト目の値が「90」になるように書き出したいんではないですか?
そうです。
fwrite関数で書いても変になったので・・・。
bufというのをつかうんですね?いまいちこのbufの使い方をわかってないんで・・・・。
ちょっと勉強してみます!
ありがとうございました!!!
No.2
- 回答日時:
こんにちは。
itohhといいます。使用しているOS、開発環境がなにか判らないのではっきりしたアドバイスができませんが
考え方として。
>テキストファイルに903C408360803C0000みたいに吐き出すプログラム
これは、英数字を文字列として書き出しているということですよね?
バイナリとしたい場合は、例えば。
先頭の"90"を例にすると、
文字列"90"ではなく、16進数「0x90」(C,C++の場合)として書き出さなければいけません。
ですから、プログラム内で何らかの変換が必要だということです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- C言語・C++・C# 100バイトのバイナリファイルを読み込んで別のファイルに書き込みたいのですが、型をどうすればいいのか 1 2022/11/03 17:11
- PDF ワードで作った文書のPDF化 5 2023/04/10 16:56
- UNIX・Linux AppImageがインストールできない。実行できない?? 1 2022/07/30 12:52
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語でテキストファイルをバイ...
-
VB(VBA)で、バイナリデータを使...
-
ファイル変換
-
既存のテキストファイルを開く方法
-
VBA。開いているテキストファイ...
-
テキストファイル内容の、16進...
-
別のサーバーのテキストファイ...
-
ATTファイルってどうやって開け...
-
WORDのVBAで差し込み印刷時、デ...
-
テキストファイル(英語&日本...
-
バイナリデータの中からMidのよ...
-
テキストファイルの一部分を抽...
-
単語数をカウントするアプリケ...
-
C言語のソースからコメントを抜...
-
VBSでテキストファイルの2行目...
-
Excel VBAが徐々に遅くなる
-
Google検索履歴のテキストファ...
-
エクセルVBAでメールの自動作成...
-
テキストファイルをiCalendar形...
-
ファイルのチェックサムを改行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ATTファイルってどうやって開け...
-
テキストファイルの一部分を抽...
-
既存のテキストファイルを開く方法
-
テキストファイルの特定行の削...
-
StreamReaderで読み込んだファ...
-
VB(VBA)で、バイナリデータを使...
-
Excel VBAが徐々に遅くなる
-
VBSでテキストファイルの2行目...
-
C言語のソースからコメントを抜...
-
テキストファイルをSQLServerデ...
-
[VB.NET] 処理の高速化を行いた...
-
テキストファイル固定長データ...
-
テキストファイル内容の、16進...
-
EXCEL VBAでカンマ区切りテキス...
-
エクセルVBAでメールの自動作成...
-
ストリームについて。
-
WORDのVBAで差し込み印刷時、デ...
-
ファイルの中身
-
Google検索履歴のテキストファ...
-
別のサーバーのテキストファイ...
おすすめ情報