![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
No.6ベストアンサー
- 回答日時:
No.4の方が使っている test_data というのは、No.2の方が配列として定義したやつですよね。
だとしたら、後で
test_data += 2
というふうに値を変更することはできません。
test_data += 2 というのは test_data = test_data + 2 同じ意味です。
コンパイル時に警告やエラーが出るかどうかはわかりませんが、C言語では配列を指すtest_dataのような変数に、後から別のアドレスを代入することはできません。(ポインタなら後から代入できます)
char buff[8];
char *test_data = buff;
とすれば test_data に後から別の値(アドレス)を代入することができます。
sprintfを使わないで質問にある処理を行うを次のようになります。(作業ディレクトリにあるtest.datというファイルを処理するとする)
int main(void) {
FILE *fp;
unsigned char buff[8]; // バイナリデータのための配列
char test_data[16]; // 文字列のための配列
char data[] = "0123456789ABCDEF"; // 変換のための16進数資料のようなもの
int count;
fp = fopen("test.data", "rb");
fread(buff, 1, 8, fp);
for(count = 0; count < 8; count++) {
test_data[count * 2] = data[buff[count] >> 4]; // 上位4ビットの値(16進数の16の位)を文字にする
test_data[count * 2 + 1] = data[buff[count] & 0x0f]; // 下位4ビットの値(16進数の1の位)を文字にする
}
return 0;
}
戻す処理
int main(void) {
char test_data[16] = "11AB849FE2CDE593";
char buff[8];
int temp[2];
int count;
int i;
for(i = 0; i < 16; i += 2) {
for(count = 0; count < 2; count++) {
if (test_data[i + count] < '9') {
temp[count] = test_data[i + count] - 'A' + 10;
} else {
temp[count] = test_data[i + count] - '0';
}
}
buff[i] = temp[0] * 16 + temp[1];
}
return 0;
}
※どちらも、例外処理はしてません。
ありがとうございます。
やりたい事が出来ました!
ちなみに、戻す処理の方を、以下のように変更してます。
int temp[2];
int count;
int i,j;
j = 0;
for(i = 0; i < (size * 2); i += 2)
{
for(count = 0; count < 2; count++)
{
if (pTxt_buff[i + count] <= '9')
{
temp[count] = pTxt_buff[i + count] - '0';
}
else
{
temp[count] = pTxt_buff[i + count] - 'A' + 10;
}
}
pBin_buff[j] = temp[0] * 16 + temp[1];
j++;
}
このたび、本当にありがとうございました。
No.5
- 回答日時:
No4.です。
>等価のご認識ですが、1番に該当すると思います。
>1.char *testの指し示すアドレスに「文字列」"41225D0D8A71050A"を保存する。
わかりました。
でしたらNo.2の方の回答で問題ないはずです。
少し改良すると、
for(i =0; i<8; i++)
{
size = fread(buf, 1, 1, infp);
sprintf(test_data,"%02X", buf);
test_data += 2;
}
----------
size = fread(buf, 1, 8, infp);
for(i =0; i<8; i++)
{
sprintf(test_data,"%02X", buf[i]);
test_data += 2;
}
のようにループ可もできます。
この回答への補足
ありがとうございます。
すぐ確認します。
あ、それとなんですが、、
size = fread(buf, 1, 8, infp);
for(i =0; i<8; i++)
{
sprintf(test_data,"%02X", buf[i]);
test_data += 2;
}
をして出来たtest_dataを、今度は元に戻す方法(次はバイナリで読み込んだ形)にするのに、一発で変換できるsprintfみたいな方法はありますか?それとも、1文字ずつ読み込んで変換していくしかないのでしょうか?
ありがとうございます。
size = fread(buf, 1, 8, infp);
for(i =0; i<8; i++)
{
sprintf(test_data,"%02X", buf[i]);
test_data += 2;
}
をやってみたのですが、出来ずにはまっていた
ところ、No.5さんのご回答で、やり方がわかりました。
No.4
- 回答日時:
一応確認です。
>char* test_data = (char*)"41225D0D8A71050A";
>と、等価となるtest_data変数を作成したいのですが、
この「等価」の認識を教えてもらえませんか?
1.char *testの指し示すアドレスに「文字列」"41225D0D8A71050A"を保存する。
2.char *testの指し示すアドレスに「文字コード」「0x41,0x22,0x5D,0x0D,0x8A,0x71,0x05,0x0A」を保存する。
3.char *testの指し示すアドレスに「数値」で「0x41225D0D8A71050A」を保存する。
4.char *testの指し示す「アドレス」を0x41225D0D8A71050Aにする。
5.その他
この回答への補足
等価のご認識ですが、1番に該当すると思います。
char* test_data = (char*)"41225D0D8A71050A";
と宣言すると、
if( *test_data == '4')
{
処理1
}
というように、1文字に対して処理が出来るのですが、
fread("wb")でバイナリファイルを読み出しますと、
配列のデータ(上記の例で言うと2番ですかね)になってしまいます。
(*test_dataを参照すると、0x41が入ってしまいます)
ファイルから読み出した値を、
以下のようなデータ構造で持ちたいです。
*test_data = '4'
*(test_data+1) = '1'
*(test_data+2) = '2'
・
・略
・
*(test_data+14) = '0'
*(test_data+15) = 'A'
No.2
- 回答日時:
これは、バイナリデータをそのまま出力ではなく
16進数の文字列で出力したいということだと思うので、
----------------------------------
FILE *infp;
unsigned char buf[8];
char test_data[17];
infp = fopen(ファイル名, "rb");
size = fread(buf, 1, 1, infp);
sprintf(test_data,"%02X%02X%02X%02X%02X%02X%02X%02X",
buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7]);
fclose(infp);
----------------------------------
という感じだと思います。
この回答への補足
私もこれと同じことをやろうとしてたのですが、
そのときは、
sprintf(test_data, "%s%s"・・・, buf[0],buf[1]
って感じでやっていたのかも知れません。
もう一度、試してみます。
ありがとうございます^^
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 100バイトのバイナリファイルを読み込んで別のファイルに書き込みたいのですが、型をどうすればいいのか 1 2022/11/03 17:11
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- ドライブ・ストレージ HDDのチェック方法 6 2022/05/04 09:49
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
別ファイルの構造体の値を読み...
-
ヒアドキュメントの中のfor文
-
undefined offset というエラー...
-
PHP5でCSVの指定行データだけを...
-
クッキーがよくわかりません
-
rubyで複数列のデータを一行に...
-
PHPで、CSVファイルを、指定し...
-
二次元配列の削除
-
文字列の文字一文字ずつを解析...
-
指定文字を含むファイル名の取得
-
preg_splitがうまくいかないの...
-
携帯絵文字変換スクリプトで20...
-
Resource id #3 と表示されま...
-
二次元文字列をポインタで操作...
-
プルダウンメニューにDBの内容...
-
配列をループでたくさん宣言し...
-
PHP 多次元配列変数のデータ受...
-
file_existsでファイル名の部分...
-
fgetc関数について
-
PHPについて教えて下さい。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
別ファイルの構造体の値を読み...
-
複数行のデータのPOST処理に関して
-
エラーメッセージ(無効な間接...
-
Resource id #3 と表示されま...
-
ヒアドキュメントの中のfor文
-
自動で番号を振りたい
-
C言語でCSVファイルの行数を読...
-
配列同士の足し算のループ処理
-
stdClass Objectを連想配列のよ...
-
PHPでCSVの一部の行を編集したい
-
phpを実行するとファイルダウン...
-
行数が30万件ほどあるCSVから、...
-
phpでCSVファイルの中身を多次...
-
php Undefined variableエラー
-
CSVデータの行数カウントをした...
-
csvの内容を行単位で削除したい
-
複数ファイルで、それぞれの行...
-
テキストデータから指定行の削除
-
rubyで複数列のデータを一行に...
-
PHP5でCSVの指定行データだけを...
おすすめ情報