fixYabinaryをPython2, 3 両対応にした。

fixYabinaryとは

やばいなりをfixするPythonライブラリ。foremost的な。
fixYabinary 0.2.0 : Python Package Index
fixYabinaryというPythonライブラリを作った。 - 脱力系日記
Python2, 3 両対応にしたので、どう変えたかをメモ。

.encode("hex")

ファイルをバイナリとして読み込むのに.encode("hex")を使っていたが、Python3のbytes型では使えない。
だから、binascii.hexlify()に書き換えた。これはPython2と3両方で動く。

before

with open(file_path, "rb") as f:
    hex_data = f.read().encode("hex")

after

import binascii

with open(file_path, "rb") as f:
    hex_data = binascii.hexlify(f.read()).decode('utf-8')

.decode("utf-8")をつけているのは、bytes型をstr型に変換するためである。
hex_dataに"ばいなり"を入れたいのに、bytes型のままだと、b"ばいなり"となってしまう。
bytes型をstr()でstr型に変換すると"b"ばいなり""となってしまうので.decode("utf-8")を使った。
Python2で実行した場合は最初からstr型なので.decode("utf-8")は余計になるけど、互換コードとするため付けている。

.decode("hex")

バイナリをファイルを書き込める形式にするのに、.decode("hex")を使っていたが、これはPython3では動かない。だからPython3ではbytes.fromhex()を使うことによって対処した。

しかし、bytes.fromhex()はPython2では動かないので、sys.version_infoによってPythonのversionを確認してPython2と3で別のコードが実行されるようにした。
Python2, 3の両方で動く関数があったら教えて欲しいです。


before

with open(new_file_path, "wb") as f:
    f.write(result.decode("hex"))

after

with open(new_file_path, "wb") as f:
    if sys.version_info[0] >= 3:
        f.write(bytes.fromhex(result))
    else:
        f.write(result.decode("hex"))