• ベストアンサー

テキストデータをそのままバイナリへ

初心者です。 テキストデータ(ASCII)として取り込んだ 「05 50 0E」 といった文字列を そのままバイナリデータ(16進)としての 「05 50 0E」 に変換したいのですが、こういった処理をする関数ってあるでしょうか? もしなければ作ってみたいのですが、その際の考え方や有用な関数などありましたら教えていただけると嬉しいです。

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

  • ベストアンサー
回答No.2

#include <stdlib.h> typedef unsigned char byte; void a2b(char *asc, byte *bin) { while (*asc) *bin++ = (byte)strtol(asc, &asc, 16); } と定義しておいて、 void main(int, char**, char**) { byte bin[3]; a2b("05 50 0e", bin); } と呼べばbinにバイナリが入りますよ。 strtolの仕様はマニュアルで確認してくださいね。

ta89
質問者

お礼

すいません! お礼が遅れました。 わざわざサンプルまで書いていただいて有難うございました!

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • ponnta
  • ベストアンサー率17% (31/179)
回答No.4

ライブラリはよくわからないので考え方を・・・ 1:処理する文字は数字の'0'~'9'と英字の'A'~'F'(小文字が有るときはそれも考慮する) 2:数字の時は ASCII-'0'で0~9の値を取得する 英字のときは (ASCII-'A')+10 で10~15の値を取得する 3:あとは上位下位を考慮した処理を行う 上位のデータのときは左に4bitシフト 下位のときは上位のデータとorで合成する こんな感じでいかがでしょう。

すると、全ての回答が全文表示されます。
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.3

「空白区切りの16進数2桁」と言う前提が崩れないなら void a2b(char *asc, byte *bin) { while (sscanf(asc, "%02X ", bin) == 1) { asc+=3 ; bin++ ; } } なんて言うのもありですね。 実現方法はhappy_peopleさんのコードの方が綺麗かな。 ("+=3"っていう部分が自分できらい!) 実現方法自体は複数あるのでどうでも良いのですが…。 > happy_peopleさん ANSI-CではHosted Emvironmentにおいて ・main関数はint型の値を返す ・main関数は0個または2個の引数を取る と規定されています。 void main(int, char**, char**) というのは問題ありのコードです。 また、Free Standing Emvironmentではstrtol()関数の存在を期待できません。

ta89
質問者

お礼

お礼が遅れて申し訳ありませんでした。 細かいところまで色々と有難うございました。

すると、全ての回答が全文表示されます。
  • Nickee
  • ベストアンサー率15% (14/93)
回答No.1

僕だけかもしれませんが、質問の意味がわかりません。 バイナリデータとは2進数のことなのに16進数? 文字をバイナリに変換? もともと文字はデータで出来ているのですよ。 まったくバッググランドが見えないのですけれど。。

ta89
質問者

補足

すいません。説明不足&間違いです。 ちょっとうまく説明できないので例をあげます。 あるjpegファイルをLANでつないだ2台のマシンを使って一方から他方へコピーする間をパケットアナライザーで見るとします。このアナライザーは取ったパケットデータをテキストに出力します。このテキストデータを読み込んで、パケットヘッダなどの部分を削って画像データの部分だけを抜き出し、ファイルへ出力して元のjpegファイルを再生する、と言ったことをやりたいのです。(行為自体に深い意味はありません) テキストから読み込んだデータは16進ダンプの表記になっていて、これをどうやってそのままのバイナリデータに変換したらいいか、というのが質問の趣旨です。 アドバイス頂けると幸いです。宜しくお願いします。

すると、全ての回答が全文表示されます。

関連するQ&A