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

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

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

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

Q&A

7回答

1408閲覧

バイナリデータに対してのデコードプログラムの作成

46psm

総合スコア16

C

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

0グッド

0クリップ

投稿2018/12/20 13:34

こんにちは

私は今、加速度センサからのデータをSDカードに保存しようとしています。
測定データをすぐにバイナリデータとしてSDカードに書き込み、文字化けのような状態となっています。
これをデコードして数値として読める状態にしたいです。

一言でいうと、バイナリデータを保存してあるテキストファイルに対してデコードプログラムを適用するということをしたいです。

例としてバイナリデータを保存してあるテキストファイルを添付します。
タブで区切られており、加速度センサの出力値として
左から時間、XH_data、XL_data、YH_data、YL_data、ZH_data、ZL_data
の7つのデータが1つの行となり、構成されています。

どのようなデコードプログラムを適用すれば読めるようになるのでしょうか?
分かる方がいらっしゃいましたら是非ご教授お願い致します。

o・ @ @@  @ @@  @ @@  @@  @@  @  o; @ @@  @ @@  @ @@  @@  @@  @  ヲ侫; @@ @@  @ @@  @ @@  @@  @@  @  o・ @@ @@  @ @@  @ @@  @@  @@  @  ラ」; @@ @@  @ @@  @ @@  @@  @@  @  ァ崙; @@ @@  @ @@  @ @@  @@  @@  @  C`・ @@ @@  @ @@  @ @@  @@  @@  @  o< @@ @@  @ @@  @ @@  @@  @@  @  スt< @€ @  € @  € @  @  @  @  ラ#< @€ @  € @  € @  @  @  @  Y94< @€ @  € @  € @  @  @  @  ァ侫< @€ @  € @  € @  @  @  @  ・T< @€ @  € @  € @  @  @  @  C`e< @€ @  € @  € @  @  @  @  堕u< @€ @  € @  € @  @  @  @  o・ @€ @  € @  € @  @  @  @  砲・ @€ @  € @  € @  @  @  @  スt・ @€ @  € @  € @  @  @  @  茹・ @€ @  € @  € @  @  @  @  ラ」< @€ @  € @  € @  @  @  @  2ャ< @€ @  € @  € @  @  @  @  Y9エ< @€ @  € @  € @  @  @  @  €jシ< @€ @  € @  € @  @  @  @  ァ崙< @€ @  € @  € @  @  @  @  ホフフ< @€ @  € @  € @  @  @  @  ・ヤ< @€ @  € @  € @  @  @  @  /ン< @€ @  € @  € @  @  @  @  C`・ @€ @  € @  € @  @  @  @  j啄< @€ @  € @  € @  @  @  @  堕・ @€ @  € @  € @  @  @  @  ク・< @€ @  € @  € @  @  @  @  o= @€ @  € @  € @  @  @  @  += @€ @  € @  € @  @  @  @  匹 = @€ @  € @  € @  @  @  @  (\= @€ @  € @  € @  @  @  @  サt= @€ @  € @  € @  @  @  @  N・= @€ @  € @  € @  @  @  @  o・       o; €タ €@  タ €@  タ €@  €@  €@  @  ヲ侫; €タ €@  タ €@  タ €@  €@  €@  @  o・ €タ €@  タ €@  タ €@  €@  €@  @  ラ」; €タ €@  タ €@  タ €@  €@  €@  @  ァ崙; €タ €@  タ €@  タ €@  €@  €@  @  C`・ €タ €@  タ €@  タ €@  €@  €@  @  o< €タ €@  タ €@  タ €@  €@  €@  @  スt< €タ €@  タ €@  タ €@  €@  €@  @  ラ#< €タ €@  タ €@  タ €@  €@  €@  @  Y94< €タ €@  タ €@  タ €@  €@  €@  @  ァ侫< €タ €@  タ €@  タ €@  €@  €@  @  ・T< タ @@   @@  @@  @@  @@  @  C`e< タ @@   @@  @@  @@  @@  @  堕u< タ @@   @@  @@  @@  @@  @  o・ タ @@   @@  @@  @@  @@  @  砲・ タ @@   @@  @@  @@  @@  @  スt・ タ @@   @@  @@  @@  @@  @  茹・ タ @@   @@  @@  @@  @@  @  ラ」< タ @@   @@  @@  @@  @@  @  2ャ< タ @@   @@  @@  @@  @@  @  Y9エ< タ @@   @@  @@  @@  @@  @  €jシ< タ @@   @@  @@  @@  @@  @  ァ崙< タ @@   @@  @@  @@  @@  @  ホフフ< タ @@   @@  @@  @@  @@  @  ・ヤ< タ @@   @@  @@  @@  @@  @  /ン< タ @@   @@  @@  @@  @@  @  C`・ タ @@   @@  @@  @@  @@  @  j啄< タ @@   @@  @@  @@  @@  @  堕・ タ @@   @@  @@  @@  @@  @  ク・< タ @@   @@  @@  @@  @@  @  o= タ @@   @@  @@  @@  @@  @  += タ @@   @@  @@  @@  @@  @  匹 = タ @@   @@  @@  @@  @@  @  (\= タ @@   @@  @@  @@  @@  @  サt= タ @@   @@  @@  @@  @@  @ 

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

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

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

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

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

cateye

2018/12/20 13:47

"加速度センサからのデータ'のフォーマットは分かりますか?
46psm

2018/12/20 15:42

返信ありがとうございます。 加速度センサからのデータフォーマットとしてデータシートを見たところ、 16bit出力と2の補数表示ということが分かりましたがこのことであってますか? X軸Highで8bitとX軸Lowで8bitでそれを合わせてX軸で16bitの出力とするみたいです。
guest

回答7

0

バイナリデータを文字表示させればそりゃ文字化けになります。
16進変換したダンプデータにして表示させましょう
このままでは意味不明なままですぜ

投稿2018/12/20 13:49

編集2018/12/20 13:59
y_waiwai

総合スコア87749

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

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

46psm

2018/12/20 15:39

返信ありがとうございます! SDに書き込む前にsprintfなどでchar型などに変換してから書き込むのではなく、高いサンプリング周波数を確保するために、データを書き込んでからそのデータに対して16進変換を行ったりの解析を行おうと考えています。 文字化けファイルに対してのデコード方法は不可能ですか?
pepperleaf

2018/12/20 15:56

まず、16進表記。 バイナリエディタ使いましょう。 というものの今使えるバイナリエディタ何だろう? Bz ?
y_waiwai

2018/12/20 22:38

SDに書き込む場合は変な変換などせずに、バイナリそのままで書き込んでください。 その書き込んだファイルに対して、加工したり表示させたりします バイナリエディタというツールで(WindowsならBzエディタなど)、バイナリファイルの内容の参照ができます
46psm

2018/12/21 12:41

バイナリエディタ使用してみました! 数字とアルファベットになりましたが、これらの文字が何を意味するのか、変換表やツールなどはありますか?
y_waiwai

2018/12/21 12:48

その数字とアルファベットで各バイトのバイナリ値を表現してます。 ましかし、そのバイナリ値がなにを表現してるかは、あなたが知っておくべきものなんですが。 それが理解出来ないでは、到底そのシステムを扱うスキルに達していないと言わざるを得ませんね
46psm

2019/01/09 14:55

バイナリ値はそのまま16進数として解釈してしまっても大丈夫ですか?
y_waiwai

2019/01/09 23:53

というより、16進数で表現しないと表しようがないですね
guest

0

ファイルに書き込めているのですから、簡単には、 fgetc() あたりの関数を使って、1バイトずつ読み込んで、16bitで 1データとの事なので、2 byte --> 1データに変換すれば、良いのでは?

C

1// FILE *fp = fopen(....) 2 int first, second; 3 int byteData; 4 while (1) { 5 first = fgetc(fp); 6 second = fgetc(fp); 7 if ((first == EOF) || (second == EOF)) break; 8 byteData = first * 0x100 + second; 9 } 10

みたいにすれば、読込めるかと思いますが、、、
ただ、データ形式確認していないので、違うかも。

投稿2018/12/21 12:44

pepperleaf

総合スコア6383

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

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

46psm

2019/01/09 14:42

コメントありがとうございます! 遅くなってしまい申し訳ございません。 参考にしてみたところ、fgetsで読み取ったデータは文字化けしているデータであったため、データの解析を行うことができない状況となっています。 pepperleafさんの言う通り、データ形式が問題であることが考えられます。 文字化けデータにたいして何か手を加えないといけないかと思いますが何か方法はありますか?
guest

0

ん?
過去のこの質問の件ではないのですか?
https://teratail.com/questions/158589

投稿2018/12/20 23:52

ttyp03

総合スコア16998

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

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

46psm

2018/12/21 12:06

返信ありがとうございます! 以前はSDカードへの記録を行う前にsprintfでchar型に変換することで、人間が一目で見て分かる数字として記録していました。 しかし高いサンプリング周波数を確保したいため、sprintfを使わずに記録し、記録したデータをもとに解析を行おうと考えています。 説明不足ですみません。
ttyp03

2018/12/24 23:56

なるほど。 では、前回のことができているのなら、同じことをファイルから読み込んでやるだけだと思います。
46psm

2018/12/28 08:57

なろほど! テキストエディタなどで見ようとしていたから文字化けしているのであって、そのままデータに対して単位の変換係数をかけるなどの解析を行って最後にchar型で出力することで同じ結果になるのですね! 参考になります。一度試してみます。
46psm

2019/01/09 15:03

試してみたところ、同じようにファイルから読み取ったところ文字化けデータを読み取ってしまいデータの解析が行えない状態です。 文字化けデータに対するデコード方法はありますか?
ttyp03

2019/01/09 23:34

バイナリデータに対して文字化けどうこうは関係ないと思います。 適切に読み込んで、適切に出力すれば文字化けしなくなります。 例えばint型のデータをファイルに書き込んだものを読み取るなら、int型の変数に適切なサイズで読み込み、適切にprintfすればよいだけです。 // 書き込み int a = 100; fwrite(&a, sizeof(a), 1, fp); // 読み込み fread(&a, sizeof(a), 1, fp); printf("%d\n", a); と同様なことをやるだけです。
46psm

2019/01/10 16:08

丁寧に教えていただきありがとうございます。 私はchar型で書き込んでいるため、char型の配列を用意し、freadで読み込みました。そしてその後printfにより表示を行ったのですが文字化けデータを出力してしまいます。 fp = fopen(fname,"rb"); char row[10]; fread(row,1,5,fp); printf("%s\n",row); のようにしているのですが、適切でないような原因はあるのでしょうか。
ttyp03

2019/01/10 23:40

その書き込んでいるデータはテキスト文字列なのですか? そうでないなら暗に%sで出力するのは無理です。 前質問内容を見るとセンサーからの出力データがHighとLowでそれぞれ8bitとのことなので、それを素直にファイルに書いているのであれば、1バイトずつ読んで、%xなりで出力するのが妥当です。 もしくは2バイトずつ読むとか。 char row[10]; fread(row,2,1,fp); printf("%02x%02x\n", row[0], row[1]);
guest

0

X軸Highで8bitとX軸Lowで8bitでそれを合わせてX軸で16bitの出力とする

であれば、まずXとYを8ビットを16進文字文字に変換して表示してみましょう。win環境ならバイナリエディタ(フリーであります)、UNIX環境ならodコマンド(Macもあるのか?)あとは自作で・・・read()で読んでprintf()かな?

投稿2018/12/20 20:41

cateye

総合スコア6851

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

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

46psm

2018/12/21 12:29

バイナリエディタxeditというやつを試してみました。 数字とアルファベットの文字列になりました。 これをテキストなどに保存して一文字ずつ対応する文字へと比較しながら変換するしかないですかね?
guest

0

混乱していらっしゃるようですね。。。。。。

Binaryというのは、ビット単位で意味を持つデータの事です。
例えば、00110001という2進数が正整数表現の2進数だとすれば、10進数の49と同じ値を表現しています。

一方、文字のコードも複数ビットで表現されます。
例えば、"1"という文字を表す ASCIIコードは、00110001です。

では、00110001をどう扱えば良いのでしょうか?
それは、そのデータを作り、使う人の都合次第です。

SDカードにバイナリデータとして書き込んだのであれば、それはバイナリーデータとして扱うべきです。
00110001を文字"1"と扱うのは筋違いです。元々49という値を表すものとして書き込んだのですから。
また、バイナリデータを文字コードだとして扱う(字化けした訳の分からない表示がされる)のも間違いです。

同様に、文字コードをバイナリデータとして扱うのも間違いです。"12"という文字列が、00110001 00110010 表現されていたからとしても、それを2進数の 0011000100110010 と解釈して ‭12594‬ という数値と考えるのは間違いです。

バイナリとして作ったデータは、明示的に変換しない限りはバイナリとして扱う。
文字コードとして作ったデータは、明示的に変換しない限りは文字コードとして扱う。
これが原則です。

==
バイナリデータを人間が読みやすくするためには、16進数表記や8進数表記を使うのが一般的です。

16進表記は、バイナリデータを4ビットずつに分けて、4ビットを1つの文字(0~9と、A,B,C,D,E,F)で表すというものです。
例えば、0011000100110010 は、 0011 0001 0011 0010 と分けて、0x3132と表現します。先頭の0xは、heXadecimal(16進数)で表記している事を表します。

投稿2019/01/09 15:21

coco_bauer

総合スコア6915

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

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

0

まず大前提、binary editor(BzとかFavbinEditとか)はbinary fileを覗いて手計算でdecodeするために使うものでそれそのものでデータを加工するわけではありません。

左から時間、XH_data、XL_data、YH_data、YL_data、ZH_data、ZL_data
の7つのデータが1つの行

bianry fileに行という概念はありません。きちんと仕様を確認してください。

投稿2018/12/22 12:14

yumetodo

総合スコア5850

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

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

46psm

2018/12/28 08:46

コメントありがとうございます なるほど、保存していたファイルが.txt形式のファイルであったので勘違いしていました バイナリエディタで開いたところ、改行は0Aで表されるのですね バイナリエディタを用いてデコードする方法を具体的に教えていただくことは可能ですか?
yumetodo

2018/12/28 08:57

当該binary fileがどういう仕様になっているのかは一旦置いておき、例えばBMPファイル(画像)を例に上げてみましょう。これの仕様は https://en.wikipedia.org/wiki/BMP_file_format#/media/File:BMPfileFormat.png のようになっているのですが、これに従って、バイナリエディタを見ながら、どこからどこまでが何のデータかを調べて、そのデータののフォーマットに従って脳内でdecodeしていくわけですね。 プログラムでデコードするときも同じで、使用に従ってnbyteずつ(場合によってはbit単位)で読み込んでは変換してとしていくわけです。 ただまぁCだと普通データ構造に厳密に対応する構造体を用意して一気にfreadかなにかで読み込むということも行われます。ここで厳密に、というのが大事で、なんでかというとpaddingがあるからですね。
guest

0

  1. 加速度センサのデータシートを読んで、どういうデータフォーマットで出力しているか確認する。
  2. そのとおりにデータを解釈する。

すべての加速度センサに共通する変換方法なんてないです、メーカー、製品ごとにバラバラです

投稿2018/12/20 13:51

ozwk

総合スコア13521

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

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

46psm

2018/12/20 15:34

返信ありがとうございます! 加速度センサのデータシートを読んだのですが、 ここでいうデータフォーマットとは、16bit出力で2の歩数表示であるということで間違いないでしょうか?それ以上の情報はデータシートからは得られませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問