• ベストアンサー

ダンプツール作成… 行き詰まりました

当方、C言語初心者です。チームでプログラム作成しているのですが、ダンプツールの作成で行き詰ってしまいました。 バイナリ形式で吐き出されたデータを書き直し、txt形式で吐き出すプログラムが作りたいです。 バイナリデータは64ビットで形成され、最初の2ビットで形式を、次の2ビットでデータサイズを表しています。 先頭2ビット:10(仮にAを表すとします)   2ビット:11(50サイズを表すとします) 上記バイナリを、Aや50と書き換えてtxtに書き出す。 (バイナリデータの数だけ繰り返すものです) 参考サイト等見ているのですが、どうにも理解できません。 Cを少し勉強しただけでは作れる代物ではありませんでした… 仲間内で作成している為、他のメンバーに迷惑を掛けたくありません。 そんな状況から、此方に書き込みさせていただきました。 ご教授、何卒よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

とりあえず、何らかの方法で64ビットのデータを受け取り、それをuint_least64_t型の変数dataに格納するものとして、少し書いてみます。 uint_least64_t data; /* 何らかの方法でデータを受け取る */ /* 上位から2ビットずつ取得 */ int first_2bits = (data >> (64-2)) & 0x3; int second_2bits = (data >> (64-4)) & 0x3; 先頭ビットというのは上位ビットだと解釈して書いてみました。 該当モードの割り出し方法はまったく分からないので、自分で考えてください。 ちなみに、ビットフィールドを使うと、ビットの並び等がどうなるか処理系定義ですので、外部とのインタフェースに使うのはお勧めできません(参考URLを参照)。

参考URL:
http://portable-c.jugem.jp/?eid=8
Him366
質問者

お礼

ご返答有難うございます。 先頭ビット=上位ビットで間違いありません。 Cの知識的にも、仕様的にも、曖昧な自分が質問をするのはだいぶ早すぎたと痛感しております。 もう少し勉強をして、知識を身に付け、それでも詰まったら再度質問しようかと思います。 (0x3と書かれて、調べなければ何の事か分からなかったくらい無知です) 教えていただいた知識は無駄には致しません。 至らない自分に貴重な時間を割いて頂き、jactaさん、mizunekoさん有難うございました。 このような中途半端な知識では逆に混乱させてしまいますので、一度質問〆たいと思います。乱文、場汚し、失礼しました。

その他の回答 (3)

  • mizuneko
  • ベストアンサー率16% (3/18)
回答No.3

>参考サイト等見ているのですが、どうにも理解できません。 検索するなら、"ビットフィールド"でしょうか。

Him366
質問者

お礼

有難うございます。参考までに関連サイトを回って見ます。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> とある機械が内部で行った情報をバイナリ形式で吐き出してくるのですが ですから、それはどうやって吐き出されて、どうやって受け取るのですか? > ■■□□△△△…△ (64Bit) > ■2BitでAモードを判断 > □2BitでBモードを判断 □2ビットはサイズではなかったのですか? それから、■が配置されているのは、64ビットデータの上位側ですか?

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

> 仲間内で作成している為、他のメンバーに迷惑を掛けたくありません。 仕事でやっているのか、部活等でやっているのか、ボランティアでやっているのか、趣味でやっているのかわかりませんが、基本的にはチーム内で解決すべき問題かと思います。 具体的な作成方法は、情報が少なすぎて説明できません。 そもそも、バイナリ形式のデータというのが、ファイルなのか、何らかの通信経路や入力ポートや専用バスを通して得られるものなのかもさっぱりわかりません(多分こうだろうと思い込むことは簡単なのですが...)。 最初の2ビットというのが、具体的にはどのビットを指すのかもわかりません。10は仮にAとのことですが、では、00, 01, 11は何なのでしょうか? 11が50サイズというのもわかりません。では、00, 01, 10は何を表すのでしょうか?また、50サイズというのは50バイトのことでしょうか?それとも50ワード(ワード長は?)でしょうか?あるいは、もっと別の単位でしょうか?

Him366
質問者

補足

ご指摘有難うございます。 当方は仕事関係でのツール作成(無くても良いけど、あった方が便利程度のもの)です。 自分の文章力の無さは痛感しております。 なにぶんCは専門時代少し触っていましたが、仕事に入ってからはテスト業務がメイン、つい最近部署移動で急に開発も行うことになった人間です。C知識の無さもあり、変な回答すると思いますがご了承ください。 ツールですが、とある機械が内部で行った情報をバイナリ形式で吐き出してくるのですが、それをいちいち解析するのが面倒とのことで、勉強がてらということで作成をお願いされました。 機械が吐き出してくるバイナリは、機械の現在の状況(設定)です。 たとえば、スピーカーが○○形式で、マイクが○○形式といったものです。変な例えを書いて、逆に混乱させてしまったことをお詫びしますorz データ構成は… ■■□□△△△…△ (64Bit) ■2BitでAモードを判断 □2BitでBモードを判断 バイナリデータ■から、A該当モードを割り出し    ”   □から、B該当モードを割り出し 最後にtxt形式で書き出す… といった感じです。 質問している本人がそこまで仕様について詳しくないというのは致命的ですね… もう少し把握してから質問するべきでしたorz

関連するQ&A

  • BMP → AVI 作成について

    みなさんはじめまして。 今回、AVIファイルを開き、ヘッダー及びBMPデータをバイナリ形式で書き込んでいくプログラムを作成しようと考えています。 AVIを開く時点での、AVIファイルのヘッダーのビット配列がわかりやすい表などで乗っているサイトをご存知の方おりましたら教えていただけないでしょうか。 よろしくお願いします。

  • パールの組み込み関数dumpって

    牛歩ですがプログラミングPerl読み進めています! 今回はdumpという組み込み関数について質問です。 関数の詳細はさておき、とりあえずこの関数を呼び出すとバイナリーファイルが作成されると思っているのですが・・・ プログラムを実行すると Aborted という味気ないエラーを表示して終了します・・・ そしてバイナリーファイルも見あたりません。 どこか決まった場所に出来るのでしょうか。 どなたか教えてください。

    • ベストアンサー
    • Perl
  • バイナリーで保存

    お世話になります。 VB6を使いプログラムを作成しているのですがデーター「 A,B,C,愛 」 をUNICODE でバイナリ形式で保存したいのですが手順がわかりません。 どなたか教えていただけないでしょうか。 よろしくお願いします。

  • 82 00 00 41で始まるバイナリ

    サイズの大きなバイナリファイルを入手しました。 ダンプすると先頭は 82 00 00 41~ でした。 ダンプの最後は 05 F0があって、そのF0以降はたくさんの00でした。 思い当たるファイルフォーマットはありませんでしょうか?

  • バイナリデータ作成したいのですが、fwriteの使用方法を教えてください。

    indataというhexで書かれたテキストファイルをバイナリデータに変換したく 以下のようなプログラムを作成しましたが、dataのサイズを大きくすると coreダンプしてしまいます。具体的には7M超くらいから。 入力ファイルサイズはほぼ無限にあり、出力バイナリファイルは20MByteは欲しいです。 どのように改造したら、大きなサイズのバイナリファイルが作成できるでしょうか? 初心者ながら、いろいろ調べてここまで作成したので、根本がおかしいかもしれません。 よろしくお願いいたします。 #include<stdio.h> int main(void) { FILE *FPi, *FPo; char data[5000000]; int getdt,x; FPi=fopen("indata","r"); if ( FPi == NULL ) {return 1;} FPo = fopen("res.bin","wb"); if ( FPo == NULL ) {return 1;} x=0; while (1) { if(fscanf(FPi,"%x" , &getdt) == EOF ) {break; } data[x]=getdt; x++; } fwrite(data, sizeof(data), 1, FPo); fclose(FPo); fclose(FPi); return 0; }

  • pg_dumpではかれたテキストファイルを実行もデータの移行失敗

    DBを開発環境から、本番環境へ移行する際、pg_dumpではかれたデータを元に、pg_restoreで復元しようとした所、エラーが出て、うまくいかず。pg_dumpをtxt形式で出力させ、それを実行させました。 結論から言うとテーブルは全て作成されましたが、データの移行が出来ていませんでした。エラーは出ていませんが、COPYコマンドがうまくいっていないようでした。 開発環境がPostgres8.xで本番環境がPostgres7.4.3なのが影響している可能性が高いと判断してますが、どなたかわかる人はおりませんでしょうか。

  • ダンプリストア時のDBデータ不整合

    環境 CentOS5系 64bit DBバージョン 8.3.3 本番DBサーバからpg_dump -c -D でダンプしたデータを、ローカルテストDBサーバ へpsql にてリストアした際、データ不整合が、一部のテーブルに発生しました。 前のデータが一部クリアされずに残っている状況です。 ダンプのデータは、DBの内容と同じなのですが。 因みに、pg_dump パラメータ無しのダンプのリストアでは、発生しません。 何が、原因でしょうか? もしかしてバグ? ご教授願えれば幸いです。 宜しくお願い致します。

  • C言語のfwrite関数について

    現在,バイナリのデータを処理するプログラムを作成しています。 おおまかに言えば,ファイルA(バイナリモードでオープン)からバイナリでデータを読み込んできて,そのデータを処理してファイルB(バイナリモードでオープン)に書出す,のようなプログラムです。 その処理したデータを入れるデータ型にunsigned long long int型(64bit)を使用しています。 その処理データをファイルBに書出す時に,fwrite関数を用いています(例参照)。 (例) for(i=0; i<N; i++){ fwrite(&c[i], sizeof(c[i]), 1, fp); } //配列cが「unsigned long long int型」です。 //配列cは最初に"0"で初期化しています。 //fpはファイルポインタです。 しかし,本システムでunsigned long long int型が実際に使用しているのは下位32bitです。 上の例で書出した場合,上位32bitの"0"も書出されていることになるのでしょうか。 書出されたファイルのサイズを見れば,64bit全て書出されているようですが,計算間違いで32bitを超えたところまで何かデータが入っている可能性もあります。 どなたはfwrite関数に詳しい方,ご回答をよろしくお願いします。

  • どなたか知恵をお貸しください。

    下記のような、データ加工プログラムをJavaで書こうと思っているのですが 暗礁に乗り上げています。 どなたか、良い知恵(どのようなアルゴリズムが考えられるか、等)を お貸しいただけないでしょうか? よろしくお願いいたします。 【元ファイルのビット列】 ・・・・00000001 00011100 00000000 10000100 01001100・・・・・ ↓「00000001 00011100」の先頭6ビットを削除 【新規ファイルに書きこみ】  01000111 00 ↓以降のビット列をそのまま新規ファイルに追加書きこみ 【書きこみ結果】  01000111 00000000 00100001 00010011 00・・・・・ 【処理概要】 1.バイナリファイル(サイズは不特定)を先頭から読みこむ。 2.00000001 00011100というビット列が現れるまで、読み捨てていく。 3.上記のビット列が現れたら、00000001の先頭6ビットを削除し、  その結果を新規ファイルに書きこむ。  このビット列が元ファイルの何バイト目に現れるかは、その都度違う。 4.それ以降のビット列(ファイルの終端まで)をすべて新規ファイルに追加書きこみしていく。

    • ベストアンサー
    • Java
  • CUI環境でのCプログラム ランダムアクセスが分からない

    CUI環境でのCプログラムを作っています。 data.txtファイルの末尾に文字を追加させるプログラムを作っています。 ---data.txtの中身------- あああ いいいいい うううううううう ええ ------------------------ このdataファイルの末尾にコマンドプロンプトから文字を追加させるには、ランダムアクセスを使えばいいと思うんですが、どのようなプログラムにすれば良いのか分かりません。ランダムアクセスはバイナリファイルでしか使えないのでしょうか?

専門家に質問してみよう