質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

886閲覧

データの変換をしたい。FF → 0xFF,

Mr.kyousuke

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/04/15 08:03

以下のようなバイト単位のデータ(変換前)を「0x」と「,」をつけて変換したいです。
データが300kBほどあり、手動ではだいぶきついです。

変換前
6A F7 F7 F7 F7 F7 F7 F3 FB F2 FB FB FB F0 F9 F9 (バイナリエディタで開いたもの)

↓(以下のように変換したい)

変換後
0x6A, 0xF7 ,0xF7 ,0xF7 ,0xF7 ,0xF7 ,0xF7 ,0xF3 ,0xFB ,0xF2 ,0xFB ,0xFB ,0xFB ,0xF0 ,0xF9 ,0xF9,

何かしらのツールやプログラムで変換したいのですが、調べてもわかりません。
どなたかいいアイデアないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nukasa

2022/04/15 08:14

バイナリーデータをテキストデータ(CSV)に変換したいということですか。
int32_t

2022/04/15 08:24

CかC++でそういう変換を行いたいということですか?
dodox86

2022/04/15 08:24

> 何かしらのツールやプログラムで変換したいのですが、調べてもわかりません。 調べた結果、何がどの様に分からないのか書かないと、回答をいただいても理解できるとは限りませんよ。自力でプログラムを書くことができないと言うことなのでしょうか。
Mr.kyousuke

2022/04/15 08:25

テキストデータではなく、16進数の0x〇〇,というものに変換したいのです。
Mr.kyousuke

2022/04/15 08:27

>CかC++でそういう変換を行いたいということですか? できればそうです。もしくはフリーのツールがあれば
nukasa

2022/04/15 08:28

0x〇〇という文字ではないのですか。それならばテキストデータですよね。
dodox86

2022/04/15 08:30

「C言語 16進数ダンプ」で検索して得られるような記事のコードを理解して修正すればできます。
Mr.kyousuke

2022/04/15 08:30

>調べた結果、何がどの様に分からないのか書かないと、回答をいただいても理解できるとは限りませんよ。>自力でプログラムを書くことができないと言うことなのでしょうか。 とあるバイナリデータ(300kB)を0x〇〇,・・・の形式に変換してソースに張り付けて使用します。 自力で書くことができない状態です。
int32_t

2022/04/15 08:34

> 変換してソースに張り付けて使用 では「テキストにしたい」で間違いないですね。 C/C++ である必要はなさそうですが、作業する環境は Windows ですか Unix 系ですか。
Mr.kyousuke

2022/04/15 08:59

windowsです。「C言語 16進数ダンプ」で頑張って作成中です
nukasa

2022/04/15 09:22

WSLかCygwinがインストールされているなら od と sed だけで済みますが。 PowerShell でも Format-Hex と replace関数を使えば実現できそうですが、PowerShell は不慣れだから、Cでコードを書いたほうが簡単だということですか。
nukasa

2022/04/15 09:32

ソースに貼り付けて使用するということは、char配列に設定して使用するとかですよね。バイナリーファイルを読み込んで、それをchar配列に設定しても同じことだと思いますが、なぜ、ソースに貼り付けないといけないのですか。学校の課題で、そう指示されているからですか。
melian

2022/04/15 10:25 編集

Windows ではなく、Linux であれば hexdump コマンドで実現可能です。 $ hexdump -v -e '16/1 "0x%02X,"' binary_file 一応、Windows 版があるのですが、 HEXDUMP for Windows https://www.di-mgt.com.au/hexdump-for-windows.html 同じコマンドラインオプションが利用できるのかどうかは判りません(私の手元に Windows PC がないので)。
dodox86

2022/04/15 10:43

> 同じコマンドラインオプションが利用できるのかどうかは判りません(私の手元に Windows PC がないので)。 Windows版のhexdumpは使ったことが無かったので試してみました。残念ながらオプションが貧相なようで、使えませんでした。 C>hexdump -v -e "16/1 "0x%02X," binary_file Invalid option -v Try `hexdump -h' for more information. C>hexdump -h Usage: hexdump [OPTION]... [FILE] Display contents of FILE in hexadecimal. With no FILE, read standard input. -C Canonical hex+ASCII display: add display of bytes as printable ASCII chars -H add ASCII display with escaped Html entities (e.g. '&' --> '&') -R add display of bytes in Raw format -V display version information and exit -h display this help and exit
dodox86

2022/04/15 10:56

質問者さん自身が『「C言語 16進数ダンプ」で頑張って作成中です』と述べられているので、まずはそちらで自力で解決されるのを見守るのが良いかもしれませんね。
thkana

2022/04/15 23:42

"ダンプ"という言葉を知らないと確かに調べるのも苦労しそう... > 調べてもわかりません 具体的にどういう調べ方をしたのか興味があります。よろしかったら教えていただけませんか。
guest

回答3

0

ベストアンサー

16バイトごとに改行します。
使用方法:プログラム名 ファイル名

C

1#include <stdio.h> 2int main(int argn,char *argv[]) 3{ 4 int val; 5 int fsize = 0; 6 FILE *fp; 7 if (argn < 2){ 8 fprintf(stderr,"%s file name\n",argv[0]); 9 return 10; 10 } 11 fp = fopen(argv[1],"rb"); 12 if (fp == NULL){ 13 fprintf(stderr,"file open error\n"); 14 return 10; 15 } 16 while(1){ 17 val = fgetc(fp); 18 if (val == EOF) break; 19 fsize++; 20 if ((fsize % 16) == 1){ 21 printf("\n"); 22 }else{ 23 printf(" ,"); 24 } 25 printf("0x%02X",val); 26 } 27 fclose(fp); 28 return 0; 29} 30

投稿2022/04/15 10:49

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mr.kyousuke

2022/04/18 05:59

fatfsというものを使っており、 f_open、f_getsなどを使ってやってみたのですが、いまいち上手きませんでした。結局、fopen、fprintfを使って実施しました。 回答ありがとうございました。
guest

0

C

1#include <stdio.h> 2#include <stdint.h> 3 4int main() { 5 uint8_t byte = 0x8A; // ファイルから読み取ったbyte値 6 printf("0x%2X, \n", byte); 7 return 0; 8}

投稿2022/04/15 10:36

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

バイナリデータを文字列にしたいってなら、

char bff[256];
sprintf(bff,"0x%02x,0x%02x,0x%02x, ...",bin[0],bin[1],bin[2], ...);

ってかんじになりますね

投稿2022/04/15 09:55

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nukasa

2022/04/15 10:02

ネタですか。300kbあるんですよ。
y_waiwai

2022/04/15 10:04

??300Kあったらネタなんですか?
nukasa

2022/04/16 01:28

300kBをsprintf 1文で出力するんですか。bin[x]を30万回書くのですか。
y_waiwai

2022/04/16 03:00

そうしたいならそうすればいいですし、そうしたくないならそうしなければいいだけです ましかし、これで一文で、ってのはちと考え方を変えましょうよ
Zuishin

2022/04/16 03:09 編集

episteme さんの回答もそうですが、入出力やループは実際のデータに合わせて自分で書けということです。 書けないなら、C 言語という条件を外して、何かツールを使えばいいと思います。バイナリエディタにそういう機能があるんじゃないですか? 0x がつかないなら、出力をさらにテキストエディタで置換すればいいでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問