Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

16進→ASCII文字変換

1,398 views
Skip to first unread message

Kenryu Tahara

unread,
Oct 15, 1999, 3:00:00 AM10/15/99
to
クロスポスト(fj.unix.shells)させていただきます。

はじめまして、田原と申します。

どなたか御存知でしたらおしえていただきたいのですが

シェルのコマンドラインで

16進の文字列(ex:a0b3)をascii 文字列に変換して
標準出力に表示させたいのですが....
odとechoの組み合わせで、できると思うのですが
なかなか、うまくいきません

どうかよろしく、おねがいします。


yas...@kudpc.kyoto-u.ac.jp

unread,
Oct 15, 1999, 3:00:00 AM10/15/99
to
 クロスポストがうまくいってないように見えるので、まとめておきました。
京都大学大型計算機センターの安岡です。ken...@violet.plala.or.jpの田原
さんは書きました。

>シェルのコマンドラインで
>16進の文字列(ex:a0b3)をascii 文字列に変換して
>標準出力に表示させたいのですが....

 ASCIIって多くとっても00~7fですから、a0とかb3ってのは変ですけど。
っていうツッコミは置いといて。

 16進は相当難しいと思います。8進なら

echo xy | tr xy '\240\263'

とやれば、まずどのUNIXでもOKなはずです。どうしても16進でやりたいなら

echo a0b3 | sed -e y/abcdef/ABCDEF/ -e 's/\(..\)/[echo | tr \\\\012 \\\\]P\1p/g' -e 's/^/16i8o/' | dc | sh

っていうイバラの道もありますけど…。
=======================================================================
安岡孝一@京都大学大型計算機センター yas...@kudpc.kyoto-u.ac.jp
http://www.kudpc.kyoto-u.ac.jp/~yasuoka/
=======================================================================

Tanaka Akira

unread,
Oct 15, 1999, 3:00:00 AM10/15/99
to
In article <3805CEE7...@violet.plala.or.jp>,
252RK7374 <ken...@violet.plala.or.jp> writes:

> シェルのコマンドラインで
>
> 16進の文字列(ex:a0b3)をascii 文字列に変換して
> 標準出力に表示させたいのですが....

> odとechoの組み合わせで、できると思うのですが
> なかなか、うまくいきません

いろいろと拡張された echo (を builtin として持っている shell)を使っているなら、

echo '\xa0\xb3'

などとできます。場合によっては -e とかをつけて backslash-escaped
characters を有効にしなければいけないかも知れません。

# System V echo であればあるというわけでもない模様。

ポータブルにやるのはなかなか厄介です。
おそらく、perl を使ってしまうのが楽でしょう。
--
[田中 哲][たなか あきら][Tanaka Akira]
「まぁ、わたしって、福の神だったのね⊇」(ヘッポコあんてぃ~く, 清水文化)

Shigeru Matsumura

unread,
Oct 15, 1999, 3:00:00 AM10/15/99
to
<38069580...@violet.plala.or.jp>の記事において
ken...@violet.plala.or.jpさんは書きました。

>>どなたか御存知でしたらおしえていただきたいのですが


>>シェルのコマンドラインで
>>16進の文字列(ex:a0b3)をascii 文字列に変換して
>>標準出力に表示させたいのですが....

GNUのコマンドに printf というのがあるので

% printf "\x061\x062\x063\n"
abc

これを適当に script にしてつくってみるとか。
--
まつむらしげる。。

Tomohiko Sakamoto

unread,
Oct 15, 1999, 3:00:00 AM10/15/99
to
In article <rsq1zax...@crane.jaist.ac.jp>,

Tanaka Akira <a...@jaist.ac.jp> writes:
> いろいろと拡張された echo (を builtin として持っている shell)を
> 使っているなら、
>
> echo '\xa0\xb3'

> ポータブルにやるのはなかなか厄介です。
> おそらく、perl を使ってしまうのが楽でしょう。

nawk で出来ますね。

% echo 1 | awk '{print "\xb0\xb3"}'

%

--
坂本智彦 saka...@sm.sony.co.jp

Tomohiko Sakamoto

unread,
Oct 15, 1999, 3:00:00 AM10/15/99
to
In article <7u73bs$6ob$1...@rdnews.sm.sony.co.jp>,

saka...@sm.sony.co.jp (Tomohiko Sakamoto) writes:
> % echo 1 | awk '{print "\xb0\xb3"}'

変なコマンドラインを書いてしまったようです。パイプは不要。

% awk 'BEGIN{print"\xb1\xb3"}'

%

--
坂本智彦 saka...@sm.sony.co.jp

Tanaka Akira

unread,
Oct 18, 1999, 3:00:00 AM10/18/99
to
In article <7ucbre$q2f$1...@narans.cc.nara-wu.ac.jp>,
ni...@ics.nara-wu.ac.jp (NIDE Naoyuki) writes:

> どうせUNIX非標準のソフトを入れねばならないのなら、今回のケースはperlで
> なしにgawkだってよかったんじゃないですか。問題になってるのはnawkの仕様の
> 違いですし。

なんとなく、すでに入っている可能性が高いのは gawk よりも perl かなぁ、
と思うんです。

awk はなまじ(最低でも old awk は)確実にはいっているぶん、わざわざ gawk
を入れてある可能性は落ちるんじゃないかと。気のせいですかね?

NIDE Naoyuki

unread,
Oct 18, 1999, 3:00:00 AM10/18/99
to
In article <rsq1zat...@crane.jaist.ac.jp>,

a...@jaist.ac.jp writes:
> なんとなく、すでに入っている可能性が高いのは gawk よりも perl かなぁ、
> と思うんです。

それはあるかも知れませんが(ないかも知れませんが)、私が「ちょっと違うん
じゃ」と感じたのは

In article <rsqyad3...@crane.jaist.ac.jp>,
a...@jaist.ac.jp writes:
> やっぱ、ポータビリティを考えると perl だなぁ。

の一文なんです。話の流れからすると、nawkは「\x」が使えるかどうかに仕様の
不統一がある、それに比べperlなら入っていさえすれば仕様は同じ、というのが
ここでの「ポータビリティ」という語の意味ですよね? なら、gawkだって入って
いさえすれば仕様は同じなんだから、「ポータビリティを考えればperl」とは必
ずしもならないんじゃないかと思ったわけでして。

「ポータビリティ」という語の意味が違っていましたらすみません。

ni...@ics.nara-wu.ac.jp

Tanaka Akira

unread,
Oct 18, 1999, 3:00:00 AM10/18/99
to
In article <7uf1ip$7pl$2...@narans.cc.nara-wu.ac.jp>,
ni...@ics.nara-wu.ac.jp (NIDE Naoyuki) writes:

> 「ポータビリティ」という語の意味が違っていましたらすみません。

考えている範囲が違うのかも知れませんね。

もちろん仕様も重要ですが、どこにもっていっても簡単に動くようにするため
にはなるべく普及しているものだけを使うようにないとうまくないですね。

# でも、坂本さんの C 版は Solaris 2 以外なら完璧なのかも知れない。
## いや PATH が... とか些細な話はあるけど。

yas...@kudpc.kyoto-u.ac.jp

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to
 お、面白そうな方向に話がすすんでる。京都大学大型計算機センターの
安岡です。a...@jaist.ac.jpの田中哲さんは書きました。

>もちろん仕様も重要ですが、どこにもっていっても簡単に動くようにするため
>にはなるべく普及しているものだけを使うようにないとうまくないですね。

 だったら、やっぱりdcですよ。下手にawkの\xとかで苦労するより

echo 16 i B1 p B3 p | dc | awk '{printf("%c",$1)}'

の方が、どうして動作するのかシロウトさんには全然わかんなくて、しか
もまず確実に動いてしまうあたり、変態的でいいと思うんですけど…。

田原

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to

こんばんわ?田原です。
いろいろ試してみてのご報告
ですが、
結論から言うと、手軽にやるのは今の環境では
ちょっと無理だということです。
スクリプトを作るかCで作るか
が急がば回れのてだてみたいです。

みなさん、ありがとうございました。m(_ _)m

KATAYAMA Yoshio

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to
In article <9910191240...@sakura.kudpc.kyoto-u.ac.jp>,
yas...@kudpc.kyoto-u.ac.jp writes:

> echo 16 i B1 p B3 p | dc | awk '{printf("%c",$1)}'

>の方が、どうして動作するのかシロウトさんには全然わかんなくて、しか
>もまず確実に動いてしまうあたり、変態的でいいと思うんですけど…。

これって、システムによって動作が変わるんですけど、、、(;_;)

このままでは、分かり難いので、od を追加してます。

SunOS 4.1.4 + JLE:

% setenv LANG C
% echo 16 i B1 p B3 p | dc | awk '{printf("%c",$1)}' | od -xc
0000000
% setenv LANG japanese
% echo 16 i B1 p B3 p | dc | awk '{printf("%c",$1)}' | od -xc
0000000 8eb1 8eb3
216 261 216 263
0000004
%

FreeBSD 2.2.7:(LANG の影響無し)

% echo 16 i B1 p B3 p | dc | awk '{printf("%c",$1)}' | od -xc
0000000 3131
1 1
0000002

意図された動作は、

FreeBSD 2.2.7:

% echo 16 i B1 p B3 p | dc | awk '{printf("%c",$1+0)}' | od -xc
0000000 b3b1
261 263
0000002
%

ではないかと思います。(でも、SunOS 4.1.4 + JLE では動かない)
--
片山@PFU

Tanaka Akira

unread,
Oct 20, 1999, 3:00:00 AM10/20/99
to
In article <380C49E5...@violet.plala.or.jp>,
田原 <ken...@violet.plala.or.jp> writes:

> スクリプトを作るかCで作るか
> が急がば回れのてだてみたいです。

ちなみに、私が作った becho というスクリプトを公開しています。
よろしければどうぞ。

http://www.ldl.jaist.ac.jp/~akr/nonresearch/free-software/junk/becho

yas...@kudpc.kyoto-u.ac.jp

unread,
Oct 20, 1999, 3:00:00 AM10/20/99
to
 京都大学大型計算機センターの安岡です。私の

> echo 16 i B1 p B3 p | dc | awk '{printf("%c",$1)}'

に対して、PFUの片山さんは書きました。

>これって、システムによって動作が変わるんですけど、、、(;_;)

 setenv LANG ja だと確かに動作がおかしいですね…。SunOS 5.5なんて、
いきなり「セグメント例外」になっちゃうし

echo xy | tr xy '\261\263'

も、何か変だし。うーむ、おそるべし日本語化SunOS。

>(でも、SunOS 4.1.4 + JLE では動かない)

 SunOS Release 4.1.2-JLE1.1.2では動いてたんで、それ以降でも大丈夫か
なと思ったのが、甘い考えでした。でもawkもtrもダメだとすると、もはや
標準Unixコマンドでは、uudecodeの助けを借りて何とかするしかないかな…。

ASADA Kazuhisa

unread,
Oct 20, 1999, 3:00:00 AM10/20/99
to
yas...@kudpc.kyoto-u.ac.jp さんは、
<9910201818...@sakura.kudpc.kyoto-u.ac.jp> に書きました:

>  setenv LANG ja だと確かに動作がおかしいですね…。SunOS 5.5なんて、
> いきなり「セグメント例外」になっちゃうし

SunOS 5.6 以降では動くようです。

ひょっとしたら 5.5.1 以降なら動くのかもしれません。
# EUC 依存を取り除くために手が入りましたので。


> echo xy | tr xy '\261\263'
> も、何か変だし。うーむ、おそるべし日本語化SunOS。

これは '\261\263' をバイト列に変換後、wchar_t の文字列に変換
すると '嘘' という一文字になりますね。

$ echo xy | LANG=C tr xy '\261\263'

$ echo xy | LANG=ja tr xy '\261\263'
嘘y
$ echo xy | LANG=ja tr xy '嘘'
嘘y
--
浅田和久/トラストシステム オープンシステム開発部

Tanaka Akira

unread,
Oct 21, 1999, 3:00:00 AM10/21/99
to
In article <9910201818...@sakura.kudpc.kyoto-u.ac.jp>,
yas...@kudpc.kyoto-u.ac.jp writes:

> でもawkもtrもダメだとすると、もはや
> 標準Unixコマンドでは、uudecodeの助けを借りて何とかするしかないかな…。

% cat <<End|
B1
B3
End
awk 'BEGIN {print "16i"} {print $0, "ps."}'|
dc|
awk '
BEGIN {print "begin 644 tmp-file"}
{printf "!%c%c \n", int($1/4)+32, ($1%4)*16+32}
END {print " \nend"}'|uudecode; cat tmp-file

ってかんじですか?

最初は dc の P を使って直接 uudecode への入力を生成しようとしたのです
が... FreeBSD では数値が出てくるのであきらめました。99 までしか動かな
い SunOS 5.7 もなんですが。

Tomohiko Sakamoto

unread,
Oct 21, 1999, 3:00:00 AM10/21/99
to
In article <9910201818...@sakura.kudpc.kyoto-u.ac.jp>,
yas...@kudpc.kyoto-u.ac.jp writes:
> でもawkもtrもダメだとすると、もはや
> 標準Unixコマンドでは、uudecodeの助けを借りて何とかするしかないかな…。

awk で出来ないことはないと思うんですが。

% echo b1b3 | awk '{h="0123456789abcdef";for(i=1;i<=length($1);i+=2)printf"%c",index(h,substr($1,i,1))*16+index(h,substr($1,i+1,1))-17}'
嘘%


echo の引数を 2個以上にして、16進数字に大文字も使えて 1桁の場合も許すと、

% echo b1 B3 a | awk '{h="abcdef0123456789ABCDEF";for(i=1;i<=NF;i++){n=length($i);for(k=1;k<n;k+=2)printf"%c",(index(h,substr($i,k,1))+9)%16*16+(index(h,substr($i,k+1,1))+9)%16;if(k==n)printf"%c",(index(h,substr($i,k,1))+9)%16}}'

%

# 約10時間前に投稿したのですが、記事が出て行っていないようなので、
# 申し訳ありませんが、再度投稿してみました。
--
坂本智彦 saka...@sm.sony.co.jp

NIDE Naoyuki

unread,
Oct 22, 1999, 3:00:00 AM10/22/99
to
うーん、LANG=jaだとだめというなら

echo 16 i B1 p B3 p | dc | sh -c 'LANG=C; export LANG;
exec awk '\''{printf("%c", $1+0)}'\'

とかではだめですか? そもそもlocaleのないシステムなら、LANGに何か設定して
も影響はなかろうということで…
ni...@ics.nara-wu.ac.jp

KATAYAMA Yoshio

unread,
Oct 22, 1999, 3:00:00 AM10/22/99
to
In article <7umvrr$2nc3$1...@rdnews.sm.sony.co.jp>,
saka...@sm.sony.co.jp (Tomohiko Sakamoto) writes:

>In article <9910201818...@sakura.kudpc.kyoto-u.ac.jp>,
> yas...@kudpc.kyoto-u.ac.jp writes:
>> でもawkもtrもダメだとすると、もはや
>> 標準Unixコマンドでは、uudecodeの助けを借りて何とかするしかないかな…。

>awk で出来ないことはないと思うんですが。

<KATE.99Oc...@yamato.trad.pfu.co.jp> に書いたのは、

>% echo b1b3 | awk '…省略… printf"%c" …省略…'

awk の printf の動作が、awk や locale によって変わるということで
す。この例や、

>% echo b1 B3 a | awk '{h="ab(以下略)

を SunOS 4.1.4 + JLE の awk で動かすと、locale が japanese の時
は(JIS X 0201 の)アウ が出力され、locale が C の時は何も出力さ
れません。
--
片山@PFU

KATAYAMA Yoshio

unread,
Oct 22, 1999, 3:00:00 AM10/22/99
to
In article <7uok4c$p2q$2...@narans.cc.nara-wu.ac.jp>,
ni...@ics.nara-wu.ac.jp (NIDE Naoyuki) writes:

> うーん、LANG=jaだとだめというなら
> echo 16 i B1 p B3 p | dc | sh -c 'LANG=C; export LANG;
> exec awk '\''{printf("%c", $1+0)}'\'

あの~、

In article <KATE.99Oc...@yamato.trad.pfu.co.jp>,
ka...@pfu.co.jp (KATAYAMA Yoshio) writes:

>SunOS 4.1.4 + JLE:
>% setenv LANG C
>% echo 16 i B1 p B3 p | dc | awk '{printf("%c",$1)}' | od -xc
>0000000
>% setenv LANG japanese

LANG=C でもダメと書きましたのですど、、、

SunOS 4.1.4 + JLE の LANG=japanese なら、

echo 16iB1B3p | dc | awk '{printf("%c",$1)}'

で動きますが、今度は他の環境で動かないでしょうね。

#10日程度投稿できなくなります(_ _)
--
片山@PFU

NIDE Naoyuki

unread,
Oct 23, 1999, 3:00:00 AM10/23/99
to
In article <KATE.99Oc...@yamato.trad.pfu.co.jp>,
ka...@pfu.co.jp writes:
> LANG=C でもダメと書きましたのですど、、、

あ、すみません。FreeBSDで、$1だとだめで$1+0ならOKな例が挙げられていた
ので、SunOS4.1.4+JLEのLANG=Cでも同じ原因でうまくいかないのだと早合点して
ました(だから$1+0ならうまくいくのではないかと思った)。

gawkでもprintf "%c","123"とprintf "%c",123では結果が違いますね…

ni...@ics.nare-wu.ac.jp

Tanaka Akira

unread,
Oct 24, 1999, 3:00:00 AM10/24/99
to
In article <KATE.99Oc...@yamato.trad.pfu.co.jp>,
ka...@pfu.co.jp (KATAYAMA Yoshio) writes:

> SunOS 4.1.4 + JLE:
>
> % setenv LANG C
> % echo 16 i B1 p B3 p | dc | awk '{printf("%c",$1)}' | od -xc
> 0000000

ふと、%c がだめなら %s をつかえばいーのではないかという気がしてきました。
例えば、

(
perl -e 'printf "%c\n", $_ foreach(128..255)';
echo 16i B1 ps. B3 ps.|dc
)|
LANG=C awk 'NR <= 128 { s[NR-1]=$0 }
128 < NR { printf "%s", s[$0-128] }'|
od -cx

とかやると、SunOS 4.1.4-JLE でも

0000000 b1b3
261 263
0000002

とでてきますし。

これを元に perl は取り除いて、128 未満は %c で扱うようにすればいい、か
な?

yas...@kudpc.kyoto-u.ac.jp

unread,
Oct 27, 1999, 3:00:00 AM10/27/99
to
 京都大学大型計算機センターの安岡です。私の

> echo xy | tr xy '\261\263'
>も、何か変だし。うーむ、おそるべし日本語化SunOS。

に対し、トラストシステムの浅田和久さんは書きました。

> これは '\261\263' をバイト列に変換後、wchar_t の文字列に変換
>すると '嘘' という一文字になりますね。
> $ echo xy | LANG=C tr xy '\261\263'
> 嘘

 あ、だとすると

echo 16 i 8 o B1 p B3 p | dc | sed -e 's/^/00/' -e 's/^.*\(...\)$/echo | LANG=C tr \\\\012 \\\\\1/' | sh

なら、マシン依存にはならないのかな? SunOS 4.1.4 + JLE という恐怖の
環境が手元にないので、ちょっと試せないですけど…。

Tanaka Akira

unread,
Oct 28, 1999, 3:00:00 AM10/28/99
to
In article <9910271602...@sakura.kudpc.kyoto-u.ac.jp>,
yas...@kudpc.kyoto-u.ac.jp writes:

>  あ、だとすると
>
> echo 16 i 8 o B1 p B3 p | dc | sed -e 's/^/00/' -e 's/^.*\(...\)$/echo | LANG=C tr \\\\012 \\\\\1/' | sh
>
> なら、マシン依存にはならないのかな? SunOS 4.1.4 + JLE という恐怖の
> 環境が手元にないので、ちょっと試せないですけど…。

% echo 16 i 8 o B1 p B3 p | dc | sed -e 's/^/00/' -e 's/^.*\(...\)$/echo | LANG=C tr \\\\012 \\\\\1/' | sh|od -x
0000000 b1b3
0000002

お、動きますね。が、

% seq 0 255|awk '{printf("%o\n", $0)}' | sed -e 's/^/00/' -e 's/^.*\(...\)$/echo | LANG=C tr \\\\012 \\\\\1/' | sh|od -x
0000000 0a01 0203 0405 0607 0809 0a0b 0c0d 0e0f
0000020 1011 1213 1415 1617 1819 1a1b 1c1d 1e1f
0000040 2021 2223 2425 2627 2829 2a2b 2c2d 2e2f
0000060 3031 3233 3435 3637 3839 3a3b 3c3d 3e3f
0000100 4041 4243 4445 4647 4849 4a4b 4c4d 4e4f
0000120 5051 5253 5455 5657 5859 5a5b 5c5d 5e5f
0000140 6061 6263 6465 6667 6869 6a6b 6c6d 6e6f
0000160 7071 7273 7475 7677 7879 7a7b 7c7d 7e7f
0000200 8081 8283 8485 8687 8889 8a8b 8c8d 8e8f
0000220 9091 9293 9495 9697 9899 9a9b 9c9d 9e9f
0000240 a0a1 a2a3 a4a5 a6a7 a8a9 aaab acad aeaf
0000260 b0b1 b2b3 b4b5 b6b7 b8b9 babb bcbd bebf
0000300 c0c1 c2c3 c4c5 c6c7 c8c9 cacb cccd cecf
0000320 d0d1 d2d3 d4d5 d6d7 d8d9 dadb dcdd dedf
0000340 e0e1 e2e3 e4e5 e6e7 e8e9 eaeb eced eeef
0000360 f0f1 f2f3 f4f5 f6f7 f8f9 fafb fcfd feff
0000400

0x00 は扱えないようで。

# awk の printf "%c" も扱えないみたいなので <rsq4sfh...@crane.jaist.ac.jp> もだめ。

yas...@kudpc.kyoto-u.ac.jp

unread,
Oct 29, 1999, 3:00:00 AM10/29/99
to
 京都大学大型計算機センターの安岡です。私の

> echo 16 i 8 o B1 p B3 p | dc | sed -e 's/^/00/' -e 's/^.*\(...\)$/echo | LANG=C tr \\\\012 \\\\\1/' | sh
に対し、a...@jaist.ac.jpの田中哲さんは書きました。

>0x00 は扱えないようで。

 0x00…、そういえば昔、どこかでglobを使う方法を書いたような気がする…。

echo 16 i 8 o B1 p B3 p | dc | sed -e 's/^/00/' -e 's/^.*\(...\)$/setenv LANG C ; echo "" | tr \\\\012 \\\\\1/' -e 's/^.*000$/glob "" ""/' | csh -f

かな? もはや呪文にしか見えませんけど…。

0 new messages