「機械語」の版間の差分

削除された内容 追加された内容
312 行
 
なので、もしもC言語で機械語として書き込む16進値を直接に指定したい場合には char 型で引用符をつけずに指定していく事になります。
 
 
 
 
 
=== テキストファイルにある16進ダンプファイルを機械語にしたい場合 ===
たとえばテキストファイル "bintest1.txt" に
9A B3 72
という6文字だけのテキストがあったとしましょう。
 
これをそのまま機械語にしたい場合、下記のプログラムで行けます。もしかしたら他の方法もあるのもしれませんが、見つからないので下記コードをwikibooksdで作りました。
 
;コード例
<source lang=c>
#include <stdio.h>
#include <stdlib.h> // atoi
 
int main() {
FILE *file;
char hairetu[1];
 
FILE *fp1;
char str1[150];
 
fp1 = fopen("bintest1.txt", "r");
 
fscanf(fp1, "%s", str1);
 
int kazu = strtol(str1, NULL, 16);
hairetu[0] = kazu;
 
file = fopen("test2.bin", "wb");
if (file == NULL) {
printf("ファイルを書き込めませんでした");
 
return 0;
}
 
// 1ブロック目 9A をここで読み取っている
fwrite(hairetu, sizeof(char), sizeof(hairetu) / sizeof(hairetu[0]), file);
 
 
// 2ブロック目 B3 を読むため繰り返す
fscanf(fp1, "%s", str1);
kazu = strtol(str1, NULL, 16);
hairetu[0] = kazu;
fwrite(hairetu, sizeof(char), sizeof(hairetu) / sizeof(hairetu[0]), file);
 
 
// 3ブロック目 72 を読むため繰り返す
fscanf(fp1, "%s", str1);
kazu = strtol(str1, NULL, 16);
hairetu[0] = kazu;
fwrite(hairetu, sizeof(char), sizeof(hairetu) / sizeof(hairetu[0]), file);
 
 
fclose(file);
return 0;
}
</source>
:(※ Windows7上でのgcc(MIn-GW)で動作確認.)
 
 
;実行結果
9A B3 72
 
 
上記のプログラミングのコツとしては、<code>char hairetu[1]; </code> のように1要素だけの配列を作ることです。3ブロック読み取りたいのでついつい<code>hairetu[3]</code>とかしてしまうがちですが、それだと、おそらくプログラミングに失敗します。
 
この配列 hairetu は、単に int kazu をそのままchar型に格納するための配列なので、要素数は1でイイのです。
 
strtol とは単に、読み取った数字を、読み取りのの際についでに16進数や10進数などの数値変数に変換してくれる、c言語の便利な関数です。
 
{{substub}}