C言語関係掲示板

過去ログ

No762 PACK編集されたchar[1] ⇒ char[2] の変換方法

[戻る] [ホームページ]
No.9474

PACK編集されたchar[1] ⇒ char[2] の変換方法
投稿者---なお(2003/09/29 18:17:40)


こんにちは。

unsigned char の2バイトのものをunsigned charの1バイトにパック編集することはできるのですが、逆にパック編集されているものを元に戻すことができません。

unsigned char data_A;
unsigned char data_B[2];

memcpy(data_B, "12", 2);
data_A =(data_B[0] & 0xF) << 4 | (data_B[1] & 0xF);

これでダンプ形式ですと 3132 になってるものが 12 にパック編集されると思います(違ってたらごめんなさい)
逆にダンプ形式で 12 になってるものを 3132 の2バイトに変換する方法
がわかりません。
どなたかよろしくお願いします。


No.9477

Re:PACK編集されたchar[1] ⇒ char[2] の変換方法
投稿者---nop(2003/09/29 18:45:12)


>逆にダンプ形式で 12 になってるものを 3132 の2バイトに変換する方法
>がわかりません。

ch に「0x12」と入っているとすると、

上位4ビット:"0123456789ABCDEF"[ch&0xF0>>4]
下位4ビット:"0123456789ABCDEF"[ch&0x0F]

で求められます。

No.9487

Re:PACK編集されたchar[1] ⇒ char[2] の変換方法
投稿者---なお(2003/09/30 10:01:31)


>>逆にダンプ形式で 12 になってるものを 3132 の2バイトに変換する方法
>>がわかりません。
>
>ch に「0x12」と入っているとすると、
>
>上位4ビット:"0123456789ABCDEF"[ch&0xF0>>4]
>下位4ビット:"0123456789ABCDEF"[ch&0x0F]
>
>で求められます。

ありがとうございます!
うまくいきました!
こんな方法あるんですね、初めて知りました。
本当にありがとうございました!!


No.9493

Re:PACK編集されたchar[1] ⇒ char[2] の変換方法
投稿者---かずま(2003/09/30 11:24:14)


> うまくいきました!
> こんな方法あるんですね、初めて知りました。

どんな方法で確認したんでしょうか?
& と >> の優先順位から、うまくいかないはずですが。

No.9494

Re:PACK編集されたchar[1] ⇒ char[2] の変換方法
投稿者---nop(2003/09/30 12:02:59)


>& と >> の優先順位から、うまくいかないはずですが。

突っ込みどうも。(^^;)
優先順位を忘れていたわ…。

 iBuf[0] = "0123456789ABCDEF"[(iCh>>4)&0x0F];
 iBuf[1] = "0123456789ABCDEF"[iCh&0x0F];

の方が良さそうだし…。

No.9496

Re:PACK編集されたchar[1] ⇒ char[2] の変換方法
投稿者---なお(2003/09/30 12:51:20)


>>& と >> の優先順位から、うまくいかないはずですが。


はい、そのままやるとだめだったのでカッコつけました。
どうもありがとうございました!


No.9497

Re:PACK編集されたchar[1] ⇒ char[2] の変換方法
投稿者---なお(2003/09/30 13:02:20)


> iBuf[0] = "0123456789ABCDEF"[(iCh>>4)&0x0F];
> iBuf[1] = "0123456789ABCDEF"[iCh&0x0F];

ちなみに
 iBuf[0] = "0123456789"[(iCh>>4)&0xF0];
 iBuf[1] = "0123456789"[iCh&0x0F];
で、いいんですよね?
一つ目は0xF0にして二つ目を0x0F。
A〜Fは必要ない。
間違ってます??




No.9498

Re:PACK編集されたchar[1] ⇒ char[2] の変換方法
投稿者---nop(2003/09/30 13:32:32)


> iBuf[0] = "0123456789"[(iCh>>4)&0xF0];
>で、いいんですよね?

良くないです。
「(iCh>>4)」で4ビット右シフトして、下位ビットへ移動させ、
それと「0x0F」で AND を取り移動した下位 4 ビットを取り出します。

>A〜Fは必要ない。

A〜F 入った場合に「"0123456789"」では何が取り出されるかわからないため、
「"0123456789\0\0\0\0\0\0"」などとした方がいいでしょう。

No.9499

Re:PACK編集されたchar[1] ⇒ char[2] の変換方法
投稿者---なお(2003/09/30 16:49:20)



>>A〜Fは必要ない。
>
>A〜F 入った場合に「"0123456789"」では何が取り出されるかわからないため、
>「"0123456789\0\0\0\0\0\0"」などとした方がいいでしょう。
確かにそうですね。ありがとうございます


No.9500

Re:PACK編集されたchar[1] ⇒ char[2] の変換方法
投稿者---nop(2003/09/30 17:10:33)


>0xF0だとうまくいくのですが、0x0FだとiBUF[0]の値がゼロになりますけど・・・。

どのようなプログラムで確認しているのでしょうか?