アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (4件)

#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の仕様はマニュアルで確認してくださいね。
    • good
    • 1
この回答へのお礼

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

お礼日時:2001/03/23 18:33

ライブラリはよくわからないので考え方を・・・



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

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

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

こんな感じでいかがでしょう。
    • good
    • 1

「空白区切りの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()関数の存在を期待できません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/03/23 18:36

僕だけかもしれませんが、質問の意味がわかりません。


バイナリデータとは2進数のことなのに16進数?
文字をバイナリに変換?
もともと文字はデータで出来ているのですよ。
まったくバッググランドが見えないのですけれど。。

この回答への補足

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

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

補足日時:2001/03/13 21:51
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A