OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

バイナリファイルの書き出し

  • 困ってます
  • 質問No.175147
  • 閲覧数398
  • ありがとう数5
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 60% (108/179)

バイナリファイルにデータを書き込むプログラムを作りたいと思っています。実は、Standard MIDI Fileのバイナリファイルを作りたいんです。
SMFについては、今まで、直接バイナリエディタで開き、16進数の数字をいじくって、データ書き換えたりしてたので直接バイナリファイルに16進数での数字を書きたいんです。
たとえば、テキストファイルに903C408360803C0000みたいに吐き出すプログラムでは、バイナリファイルに書き出してからバイナリエディタで開くと
こいつがさらに16進数に変換されてしまいますよね?
そうならないようにするにはどうやればいいんですか?
通報する
  • 回答数5
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.5
レベル12

ベストアンサー率 45% (210/459)

こんにちは。itohhといいます。

>このプログラムでは、903C408360803C0000のみを出力してますよね。
これは、あくまでも例ですから...

実際は、どのようなバイナリデータを設定したいのかによってmemcpyになるか、あるいは
その他の設定方法になるかは、yabuchanchanさんのプログラムによって変わってきます。

場合によっては、この関数(fncXtoA)を使わずに2文字(1バイト)づつ設定していくほうが
効率がいいかもしれませんし、いくつかのパターンがあるだけで条件によってバイナリデータ
を替えるだけならば、if文などでmemcpyを選択しても良いと思います。

yabuchanchanさんのプログラムにあった方法にこのサンプルを加工して使ってください。
お礼コメント
yabuchanchan

お礼率 60% (108/179)

配列を用意してそこに2文字ずつ入れて行きました。
そうするとうまくいきました。
毎回いろいろな事教えて頂いてありがとうございます。
また、わからないことあったらよろしくお願いいたします。
投稿日時 - 2001-12-05 09:12:58
-PR-
-PR-

その他の回答 (全4件)

  • 回答No.1
レベル13

ベストアンサー率 26% (267/1014)

言語は?
補足コメント
yabuchanchan

お礼率 60% (108/179)

言語はC、C++で環境はMacでCodeWarriorです。
投稿日時 - 2001-11-27 17:50:44


  • 回答No.2
レベル12

ベストアンサー率 45% (210/459)

こんにちは。itohhといいます。 使用しているOS、開発環境がなにか判らないのではっきりしたアドバイスができませんが 考え方として。 >テキストファイルに903C408360803C0000みたいに吐き出すプログラム これは、英数字を文字列として書き出しているということですよね? バイナリとしたい場合は、例えば。 先頭の"90"を例にすると、 文字列" ...続きを読む
こんにちは。itohhといいます。

使用しているOS、開発環境がなにか判らないのではっきりしたアドバイスができませんが
考え方として。

>テキストファイルに903C408360803C0000みたいに吐き出すプログラム
これは、英数字を文字列として書き出しているということですよね?
バイナリとしたい場合は、例えば。
先頭の"90"を例にすると、
文字列"90"ではなく、16進数「0x90」(C,C++の場合)として書き出さなければいけません。

ですから、プログラム内で何らかの変換が必要だということです。
お礼コメント
yabuchanchan

お礼率 60% (108/179)

言語はC、C++です。
0x90と書き出せばそれは、もしテキストファイルで開けると、文字化けしてしまうということなんですか?
投稿日時 - 2001-11-27 17:53:03
  • 回答No.3
レベル8

ベストアンサー率 39% (23/58)

itohh氏の回答へのお礼をみていて思ったのですが… コレ、「90」の十六進数をテキストに出力したいんじゃなくて 書き出したファイルをバイナリエディタで開いたときに 1バイト目の値が「90」になるように書き出したいんではないですか? で、そう仮定して書きます。 よく知らないので自信がありませんが、こういうときは "stdio.h"内のfwrite関数かと思います。 ...続きを読む
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(十六進数で一バイトずつ)を
書き込んでおけば、狙ったとおりに出力されるんではないかと。

もっと効率のいい書き方がありそうですが…
補足コメント
yabuchanchan

お礼率 60% (108/179)

>コレ、「90」の十六進数をテキストに出力したいんじゃなくて
>書き出したファイルをバイナリエディタで開いたときに
>1バイト目の値が「90」になるように書き出したいんではないですか?

そうです。
fwrite関数で書いても変になったので・・・。
bufというのをつかうんですね?いまいちこのbufの使い方をわかってないんで・・・・。
ちょっと勉強してみます!
ありがとうございました!!!
投稿日時 - 2001-11-27 21:15:59
  • 回答No.4
レベル12

ベストアンサー率 45% (210/459)

こんにちは。itohhといいます。 >0x90と書き出せばそれは、もしテキストファイルで開けると、 >文字化けしてしまうということなんですか? ACSII文字コードというのをご存じですか? ”0”文字->16進数では30となります。 ”9”文字->16進数では39となります。 ”A”文字->16進数では41となります。 ”F”文字->16進数では46となります。 ですから、0x90 ...続きを読む
こんにちは。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;
}
補足コメント
yabuchanchan

お礼率 60% (108/179)

こんにちは。
このプログラムでは、903C408360803C0000のみを出力してますよね。
ここに、条件によって違うものを出力させたいんですけど、その時に
条件文はどのようにこのプログラムに合体させたらいいのかが、よく
分かんないです。
やっぱり、memcpyをいじるんですか?
投稿日時 - 2001-12-03 12:14:14
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ