これからの季節に親子でハイキング! >>

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

このQ&Aに関連する最新のQ&A

A 回答 (5件)

こんにちは。

itohhといいます。

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

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

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

yabuchanchanさんのプログラムにあった方法にこのサンプルを加工して使ってください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/12/05 09:12

こんにちは。

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をいじるんですか?

補足日時:2001/12/03 12:14
    • good
    • 1

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の使い方をわかってないんで・・・・。
ちょっと勉強してみます!
ありがとうございました!!!

補足日時:2001/11/27 21:15
    • good
    • 0

こんにちは。

itohhといいます。

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

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

ですから、プログラム内で何らかの変換が必要だということです。
    • good
    • 0
この回答へのお礼

言語はC、C++です。
0x90と書き出せばそれは、もしテキストファイルで開けると、文字化けしてしまうということなんですか?

お礼日時:2001/11/27 17:53

言語は?

この回答への補足

言語はC、C++で環境はMacでCodeWarriorです。

補足日時:2001/11/27 17:50
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QBatファイルをバイナリ形式にする方法

いつもお世話になります。
Batファイルを作ったのですが、ファイルの内容を
見せたくありません。
バイナリにしてしまえば、テキスト等では
見れなくなるので、変換方法等あればご教授
ください。
また、バイナリに変換する以外にもファイルの内容が
わからなくなればいいので他によい方法があれば
おしえてください。

よろしくお願いします。

Aベストアンサー

凄い強引な方法ですけど良いですかね?(笑)

1)そのバッチファイルの最後に、「自分自身を削除する」命令を追加する。
2)そのファイルを、「自動解凍形式」でかつ「自動実行する様にオプションをつけて」圧縮・保存する。

これで、出来上がったexeファイルを実行すると、
・batファイルを解凍
・実行
・最後にbatファイルが削除される
という動作が出来ますし、しかもexeファイルは圧縮されているのでそのままでは中身が見えません。

但し、圧縮・解凍ソフトを利用すると、中身を確認出来てしまう欠点もありますけど…

Qバイナリである部分の書き換えについて

拡張子exeのファイルをバイナリエディタで開いてある部分を変更する。手順をパッチなどでやってくれるようにするにはどの言語で作ればいいでしょうか
わかりづらいと思うのですが、
NoDVDパッチなどのようなものです。
たとえば0×000836 56→00のようにただ書き換えるだけです。
また同じフォルダに~~~.exeがなければERRORになるように作りたいんです。

プログラミングに関してはまったくの初心者です。

Aベストアンサー

バイナリファイルを取り扱える言語なら何でも良いです。
メジャーな言語に関しては出来ない方が珍しい(VBAでさえバイナリファイル取り扱えますし)ので好きなの使ってください。


でも、手間を省くのが目的ならわざわざ作らなくても適当なツールを使えば良くない?
http://www.vector.co.jp/vpack/filearea/win/util/bin/patch/

Qバッチ処理でファイルの中身を変数に入れるやり方

あるファイルの中には1行の文字列があります。
このファイルをバッチで読み取り、変数に設定したいです。

例:
test.txt
abcacbacbacbacbacbacbacbacb

test,bat
set DATA=[test.txtを読み込んだ値]

よろしくお願い致します。

Aベストアンサー

これですね。

参考URL:http://www.upken.jp/kb/dqvgHNRUxwFDkmtoqEwfXHUjDrevNv.html

Qバイナリデータとテキストデータの違いについて

宜しくお願いします。

バイナリデータを用語辞典で調べると
「テキスト形式(文字データ)以外のデータ形式全般のこと。
実行可能形式のコンピュータプログラムや、画像や音声、
動画などのデータなどがバイナリデータにあたる。」
(http://e-words.jp/w/E38390E382A4E3838AE383AA.html)
とあります。

これでは、バイナリデータとテキストデータの違いが分かりません。

テキストデータはコードの集まりで、
さらに細かくすると0と1の集まり(?)だから・・・
と考えるとバイナリデータとテキストデータの
違いが分かりません。

Q1.私は何が分かっていないのでしょうか?
Q2.バイナリデータとテキストデータの違いを教えてください。

宜しくお願い致します。

Aベストアンサー

バイナリデータは01の集まりです。
テキストデータは文字としての意味が与えられて居ます。ただテキストデータの01としての表現方法はプラットフォーム(OSやアプリケーション)によって異なります。例えば英文字コードでもメインフレームで使われるEBCDICもあり、unixやPCで使われるASCIIもあります。また日本語など英語以外の文字をあらわすのには、さらに多くの種類があります。また改行を表す文字もいろいろです。
例えば telnet で他のコンピュータにログオンして通信する時の文字コードはASCIIで、改行はCRLFと決まっているので、そうでないコンピュータはtelnetプログラムが自分のコンピュータのコード体系と相互変換します。

ftpでテキストデータを転送する時も同じくASCIIとCRLFと決まっています。ただ日本語文字の時にどのコードを使うかは規格では決まっていないので、ftpクライアントで、相手コンピュータの日本語コード種類を指定して、自分と合わなければ転送時に相互変換します。

Cプログラムでもテキストの改行は'\n'と決まっているので、そうでないWindowsの場合はCプログラムとの間でCRLFと'\n'の相互変換が、ライブラリ中で自動的に行われます。

そういった変換を全く行わないのがバイナリデータです。画像ファイルなどはjpegと形式が決まればどのコンピュータでも同じフォーマットなので変換の必要はありません。逆にテキストとみなして変換するとデータが壊れてしまいます。

バイナリデータは01の集まりです。
テキストデータは文字としての意味が与えられて居ます。ただテキストデータの01としての表現方法はプラットフォーム(OSやアプリケーション)によって異なります。例えば英文字コードでもメインフレームで使われるEBCDICもあり、unixやPCで使われるASCIIもあります。また日本語など英語以外の文字をあらわすのには、さらに多くの種類があります。また改行を表す文字もいろいろです。
例えば telnet で他のコンピュータにログオンして通信する時の文字コードはASCIIで、改行はCRL...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qバッチでテキストファイルから任意の行のみ取得したい

batファイルを作成していて、
txtから特定の行のみをとりだし、変数に入れたいです。
どうもよくわからないので質問したいと思います。
まず以下の様なテキストファイルがあります。
-------------------
111
222
333
-------------------
実際の値、行数は違いますが、こんな感じに文字列が複数行並んでいます。

行いたい動作は、
-----------------------------------------
1.テキストファイルの1行目を変数Textに入れる(set Text=111)
2.変数Textを使用し色々処理をする
3.テキストファイルの2行目を変数Textに入れる(set Text=222)
4.変数Textを使用し色々処理をする
-----------------------------------------
コレを繰り返します。
2と4は同じ動作ですので、行数のカウンタを設定しループさせる予定です。
n行目を全て取り出す方法がわかれば行けると思うのですが、
どうも見つかりません。ご存知の方がいればお教え願いたいと思います。

batファイルを作成していて、
txtから特定の行のみをとりだし、変数に入れたいです。
どうもよくわからないので質問したいと思います。
まず以下の様なテキストファイルがあります。
-------------------
111
222
333
-------------------
実際の値、行数は違いますが、こんな感じに文字列が複数行並んでいます。

行いたい動作は、
-----------------------------------------
1.テキストファイルの1行目を変数Textに入れる(set Text=111)
2.変数Textを使用し色々処理をする
3.テキストファイルの2行目を変数T...続きを読む

Aベストアンサー

No3ですが、たぶん提示したスクリプトを見ると、ある事に気がつくはず?

findstr /n /r "." a.txt | findstr /r "^3:"

で3行目を表示してくれます。え!? それだけ。そうなんです

ただ、あと、先頭の”3:” をどうやって切り離すか? と言う問題にぶつかる。さらにファイルに先頭に”3:”があった場合、どうするのか? さらに、findstr の正規表現の動作が??? 表示すれるのはいいが、変数にどうやってセットするのか?

となる。結局 for 文を使いまわす事になります。

まあ、適当に改変して、上記の問題を解決してください。

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

Qbyte型をstring型として扱うには

今日の質問/マイページに反映されないので、再度の質問です。
windows2000-sp4/vb6-sp5環境です。ユニコードのデータをvbで直接入出力し、vb内でstring型で扱いたいとおもっています。今のところ、vbの入出力では、自動的にsjis/unicode変換がされるので、binaryで受け取り、string型にするのかなと思っています。byte型で受け取り、APIの"MoveMemory"("RtlMoveMemory")でstring型にcopyするのかなとは思っているのですが、うまくいきません。経験不足そのものです。vbでのbyte型とstring型双方向のbinaryな変換の方法をお教えください。

Aベストアンサー

dim s as string
dim b() as byte

'文字列 -> byte配列
b = s

'byte配列 -> 文字列
s = b

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QDOSバッチでのファイル出力

別ファイルで定義した変数内の文字列をファイル
出力したいと思っています。

REM 環境変数の設定 ※別ファイル内変数の読み込み
CALL ../../ENV.BAT


:SQLERROR
echo %ERROR% >> aaa.log

----------------------------

作成された「aaa.log」を見ると、「ECHO は <ON> です。」のような
メッセージが表示され変数「%ERROR%」内の文字列がありません。

変数「%ERROR%」を固定文字列にすると出力されます。

変数内文字列の出力はどうすれば良いですか?。アドバイス
お願いします。

Aベストアンサー

変数内の文字列の出力方法はそれでいいです。
ENV.BAT の中で確かに ERROR に値をセットしているのに、echo で出力されないとしたら、どこかにタイプミスなどの間違いがあるので、@echo off を削除して、画面でコマンドの実行される様子を見て、確かに ERROR にセットされているか確認してください。

そうじゃなくて、ERROR が空白かもしれないときに、echo を正しく機能させるには、
echo/%ERROR% >>aaa.log
のようにechoの次を空白でなく、何か記号を書きます。その記号自体は出力されません。


人気Q&Aランキング