2016/10/22

[python]decode('hex')した型はstrだった!

文法もろくに調べないまま、適当にpythonを使っている。
C/C++以外はどうでもいいやっていう気持ちがにじみ出てしまい、なんとかしたいのだが、どこから始めたものだか。。。

 

前回、python3でdecode('hex')ができないというのはわかったのだけど、python2でdecode('hex')した結果がなんなのか、全然把握していなかった。
気持ちとしては、バイト型の配列か何かだろうと思っていた。

foo = 'abcd'.decode('hex')
bar = len(foo) + foo

データ長を頭に付けたいので、うまくいくかどうかわからんが上記のような式を書くと、エラーになった。
「intとstrは足せません」みたいなエラーだ。

str ?

心配になったので、type(obj)でobjの型を見ることができるらしいのでやってみると、「<type 'str'」と出てきた。

decode('hex')した結果の型は、strなんだ!

プリンだと思い込んで食べていたのに、これは茶碗蒸しですよ、と言われた気分だ。
変なものを食べていたわけではないし、満足していたのだが、えっ、としか言えない。


よく考えてみれば、兆候はあった。
decode('hex')した結果を足し算したら、加算ではなく連結されていたし。
都合がよかったので見過ごしていたが、あのときによく考えれば気付いていたはずだ。

 

さて、python2で16進数を扱うのにstrを使うのは常套手段なのだろうか?
覚え始めなので、変なことは覚えたくない。
が、もうツールをdecode('hex')で作ってしまったので、普通の使い方じゃないなら、そのことくらいは認識しておきたい。

検索してみたが、よくわからなかった。
int(str, 16)みたいにして数値にしている人もいるし、decode('hex')だったり、ord()だったりhex()だったり。
やり方と表現がいろいろありすぎだ。
思うに、decode('hex')でstrになるのは、C/C++でchar型が8bitだから配列にしてバイナリデータを扱おう、と思うのと似たようなものかもしれない。

 

ちょっとまだ、pythonがどういう言語なのか理解できていない。。。


おっと、最初の課題が片付いていなかった。
データ長(1byte)を連結したいのだ。

fooにdecode('hex')したデータが入っているのであれば、len(foo)でデータ長は出てくるはず。
たぶん「\0」で終わり、なんてルールにはしていないんじゃなかろうか。

 

foo = '00112233445566778899aabbccddeeff'.decode('hex')
print '%02x' % len(foo)

こうすると、

10

になった。
うん、大丈夫だ。

 

foo = '00112233445566778899aabbccddeeff'.decode('hex')
foo = '%02x' % len(foo) + foo
print 'data=', foo.encode('hex')

こうすると、

data= 313000112233445566778899aabbccddeeff

あれ・・・。
データ長はASCII扱いになっている。
そうか、こうするしかないのか。

foo = '00112233445566778899aabbccddeeff'.decode('hex')
foo = ('%02x' % len(foo)).decode('hex') + foo
print 'data=', foo.encode('hex')

これで、

data= 1000112233445566778899aabbccddeeff

うん、ようやく認識があった。

もうちょっと格好良くしたいところだが、今の私にはこれが限界だ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。