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

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

ただいまの
回答率

90.42%

  • C

    4110questions

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

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

受付中

回答 7

投稿

flag 質問者が4日前に「まだ回答を求めています」と言っています。

  • 評価
  • クリップ 0
  • VIEW 300

46psm

score 6

こんにちは

私は今、加速度センサからのデータを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=    タ @@       @@       @@      @@       @@        @         
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • cateye

    2018/12/20 22:47

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

    キャンセル

  • 46psm

    2018/12/21 00:42

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

    キャンセル

回答 7

+2

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/21 00:39

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

    キャンセル

  • 2018/12/21 00:56

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

    キャンセル

  • 2018/12/21 07:38

    SDに書き込む場合は変な変換などせずに、バイナリそのままで書き込んでください。
    その書き込んだファイルに対して、加工したり表示させたりします

    バイナリエディタというツールで(WindowsならBzエディタなど)、バイナリファイルの内容の参照ができます

    キャンセル

  • 2018/12/21 21:41

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

    キャンセル

  • 2018/12/21 21:48

    その数字とアルファベットで各バイトのバイナリ値を表現してます。
    ましかし、そのバイナリ値がなにを表現してるかは、あなたが知っておくべきものなんですが。

    それが理解出来ないでは、到底そのシステムを扱うスキルに達していないと言わざるを得ませんね

    キャンセル

  • 2019/01/09 23:55

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

    キャンセル

  • 2019/01/10 08:53

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/21 21:29

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/21 21:06

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

    キャンセル

  • 2018/12/25 08:56

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

    キャンセル

  • 2018/12/28 17:57

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

    キャンセル

  • 2019/01/10 00:03

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

    キャンセル

  • 2019/01/10 08:34

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

    と同様なことをやるだけです。

    キャンセル

  • 2019/01/11 01:08

    丁寧に教えていただきありがとうございます。
    私はchar型で書き込んでいるため、char型の配列を用意し、freadで読み込みました。そしてその後printfにより表示を行ったのですが文字化けデータを出力してしまいます。

    fp = fopen(fname,"rb");
    char row[10];
    fread(row,1,5,fp);
    printf("%s\n",row);

    のようにしているのですが、適切でないような原因はあるのでしょうか。

    キャンセル

  • 2019/01/11 08:40

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

    キャンセル

+1

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

// FILE *fp = fopen(....)
  int first, second;
  int byteData;
  while (1) {
   first = fgetc(fp);
   second = fgetc(fp);
   if ((first == EOF) || (second == EOF))  break;
   byteData = first * 0x100 + second;
  }


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/09 23:42

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/21 00:34

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

    キャンセル

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/28 17:46

    コメントありがとうございます
    なるほど、保存していたファイルが.txt形式のファイルであったので勘違いしていました
    バイナリエディタで開いたところ、改行は0Aで表されるのですね

    バイナリエディタを用いてデコードする方法を具体的に教えていただくことは可能ですか?

    キャンセル

  • 2018/12/28 17:57

    当該binary fileがどういう仕様になっているのかは一旦置いておき、例えばBMPファイル(画像)を例に上げてみましょう。これの仕様は
    https://en.wikipedia.org/wiki/BMP_file_format#/media/File:BMPfileFormat.png
    のようになっているのですが、これに従って、バイナリエディタを見ながら、どこからどこまでが何のデータかを調べて、そのデータののフォーマットに従って脳内でdecodeしていくわけですね。

    プログラムでデコードするときも同じで、使用に従ってnbyteずつ(場合によってはbit単位)で読み込んでは変換してとしていくわけです。

    ただまぁCだと普通データ構造に厳密に対応する構造体を用意して一気にfreadかなにかで読み込むということも行われます。ここで厳密に、というのが大事で、なんでかというとpaddingがあるからですね。

    キャンセル

  • 2018/12/28 17:59

    そういやまえにzipファイルの手動decodeしたことあったわ
    https://yumetodo.hateblo.jp/entry/2016/05/08/231744
    ほい。

    キャンセル

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進数)で表記している事を表します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C

    4110questions

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