C言語関係掲示板

過去ログ

No.50. エンコードされた16進データでのビットマップ画像へのデコード


ややこしい質問で申し訳無いのですが、ビットマップの画像データを16進でエンコードしたテキストからまたビットマップへとエンコードする方法を教えてください。


こんばんは、ともじです。

ひょっとして、課題だと困るので、とりあえずヒントです。
ビットデータを16進でエンコードしたテキストの作り方は下記のようになります。
これを、逆の手順で16進のビットデータに戻してみてください。

尚、下記の方法は私の環境でWin98、LSICでの確認です。

#include <stdio.h>
#define BSIZE   8

int main(void)
{
        unsigned char bit[BSIZE] = {0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF};
        unsigned char txt[BSIZE*2+1] = {0};
        int i;

        /* ビットデータをテキストに変換 */
        for (i=0; i<BSIZE; i++) {
                txt[i*2]   = (bit[i] & 0xf0) >> 4;
                txt[i*2+1] = bit[i] & 0x0f;
        }
        for (i=0; i<BSIZE*2; i++) {
                if (txt[i] <= 9)
                        txt[i] += '0';
                else
                        txt[i] += ('A' - 0x0a);
        }

        /* 内容の確認 */
        for (i=0; i<BSIZE*2; i++)
                printf("%c ",txt[i]);
        printf("\n");

        return(0);
}

[出力結果]
0 1 2 3 4 5 6 7 8 9 A B C D E F


ここ、返信つかないですね。
誰か、やってみませんか。


>ここ、返信つかないですね。
>誰か、やってみませんか。

ビットマップの事などはよくわからないのですが、前述のスクリプトから
単純に逆の作業をやってみました。

#include <stdio.h>
<pre>
#define BSIZE 8

int main(void)
{
unsigned char txt[BSIZE * 2 + 1] = "0123456789ABCDEF";
unsigned char bit[BSIZE];
int i;

for (i = 0; i < BSIZE * 2; i++) {
if (txt[i] <= '9')
txt[i] -= '0';
else
txt[i] = txt[i] - 'A' + 0x0a;
}

for (i = 0; i < BSIZE; i++) {
bit[i] = (txt[i * 2] << 4) | (txt[i * 2 + 1]);
printf("0x%02X ", bit[i]);
}
putchar('\n');

return (0);
}
</pre>

基本的にエラー対策などは考慮に入れていませんし、
識別子などは元スクリプトのまま使いました。
"0x01"という出力方法が分からなかったので無理矢理
"%02X"で右2桁を出力しています。あしからず。

こういう類似経験の無い問題をするのはドキドキして面白いですね。
どこが間違えているのかを知るのが楽しみです。
しかし、実際に書くのは20分程でできるのに、解読するのに
1時間ちょっとも費やしてしまいました。力が無い証拠ですね。

ともじ先生!
お残りの補習ですか?それとも家に帰れるでしょうか?


Toshi_2さん、こんにちは。
早速解いてみたんですね。書き込み時間にビックリ。今日のお仕事大丈夫かな。

実は、最初のruruさんの書き込みだけでは、要領を得なかったので、勝手に
{0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF}; −> "0123456789ABCDEF"
にして、それをまた、
"0123456789ABCDEF" −> {0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF};
でいいのかな、と解釈してしまったんですね。

その解釈が正解とすると、Toshi_2さんのデコードでいいと思います。

> ビットマップの事などはよくわからないのですが、

C言語による2値画像処理入門
http://www.birds.co.jp/ocrtech/imgentry/index.htm

とても詳しく2値画像について説明してあります。参考にしてください。

> ともじ先生!
> お残りの補習ですか?それとも家に帰れるでしょうか?

いやあ、最近すっかり先生と呼ばれていますね。掲示板では、勘弁してください。ノ(´д`)
優等生のToshi_2さんにお残り補習なんて、滅相も無い。おうちでしっかり勉強してください。
ちなみに、お残りはうちの息子が得意で、しょっちゅう何かしら忘れて掃除させられて
いるようです。困ったものだ・・・。


>Toshi_2さん、こんにちは。
>早速解いてみたんですね。書き込み時間にビックリ。今日のお仕事大丈夫かな。

「寝る前にちょっとだけ覗いてみようか」、と見たところ
「誰かやってみません?」みたいなことが書かれてあったので
ついつい寝るのも忘れて夢中になってしまいました。
仕事はばっちりだったんですが、家に帰ってきたとたん
だるくなってきてしまいました。


>実は、最初のruruさんの書き込みだけでは、要領を得なかったので、勝手に
>{0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF}; −> "0123456789ABCDEF"
>にして、それをまた、
>"0123456789ABCDEF" −> {0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF};
>でいいのかな、と解釈してしまったんですね。
>
>その解釈が正解とすると、Toshi_2さんのデコードでいいと思います。

はい、そういう解釈をしてしまいました、やっぱり解釈を間違えて
いたのでしょうか?。


>C言語による2値画像処理入門
>http://www.birds.co.jp/ocrtech/imgentry/index.htm
>とても詳しく2値画像について説明してあります。参考にしてください。

これから行って勉強してみようかと思います、、、
と言いたいところですが明日は早番で5時起きの6時出勤なので
もうそろそろ寝ます。
だから明日行って二値画像処理の学習をしてみたいと思います。

・・・おやすみなさい。


> C言語による2値画像処理入門
> http://www.birds.co.jp/ocrtech/imgentry/index.htm

> とても詳しく2値画像について説明してあります。参考にしてください。

ちょっと見てきましたがとても親切丁寧な説明で良かったです。
結構内容が長いので、のんびりやってみます。

良いサイトをご紹介いただきありがとうございました。

戻る


「初心者のためのポイント学習C言語」 Last modified:2001.10.7
Copyright(c) 2000-2002 TOMOJI All Rights Reserved