-PR-
解決
済み

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

  • 困ってます
  • 質問No.51370
  • 閲覧数659
  • ありがとう数3
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 70% (7/10)

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

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

  • 回答No.2
レベル9

ベストアンサー率 30% (25/81)

#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

お礼率 70% (7/10)

すいません!
お礼が遅れました。
わざわざサンプルまで書いていただいて有難うございました!
投稿日時 - 2001-03-23 18:33:57
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル9

ベストアンサー率 15% (14/93)

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

お礼率 70% (7/10)

すいません。説明不足&間違いです。
ちょっとうまく説明できないので例をあげます。

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


  • 回答No.3
レベル13

ベストアンサー率 37% (570/1525)

「空白区切りの16進数2桁」と言う前提が崩れないなら void a2b(char *asc, byte *bin) { while (sscanf(asc, "%02X ", bin) == 1) { asc+=3 ; bin++ ; } } なんて言うのもありですね。 実現方法はhappy_peopleさんのコードの方が綺麗かな。 (" ...続きを読む
「空白区切りの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

お礼率 70% (7/10)

お礼が遅れて申し訳ありませんでした。
細かいところまで色々と有難うございました。
投稿日時 - 2001-03-23 18:36:30
  • 回答No.4
レベル10

ベストアンサー率 17% (31/179)

ライブラリはよくわからないので考え方を・・・ 1:処理する文字は数字の'0'~'9'と英字の'A'~'F'(小文字が有るときはそれも考慮する) 2:数字の時は ASCII-'0'で0~9の値を取得する 英字のときは (ASCII-'A')+10 で10~15の値を取 ...続きを読む
ライブラリはよくわからないので考え方を・・・

1:処理する文字は数字の'0'~'9'と英字の'A'~'F'(小文字が有るときはそれも考慮する)

2:数字の時は ASCII-'0'で0~9の値を取得する
英字のときは (ASCII-'A')+10 で10~15の値を取得する

3:あとは上位下位を考慮した処理を行う
上位のデータのときは左に4bitシフト
下位のときは上位のデータとorで合成する

こんな感じでいかがでしょう。
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ