文法もろくに調べないまま、適当に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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。