Python2.7でByte型←→16進数文字列の相互変換をするには？


以下のコードをPython3.7で実行すると問題なく動作します。

[code]

    import zlib
    
    message = "ababtestabab"
    
    message_test = zlib.compress(message.encode("utf-8"))
    
    # compress()により圧縮したbytesをhex()により16進表記の文字列にする
    m = message_test.hex()
    
    # ここからは逆変換
    # 16進表記の文字列からbytes型へ変換する
    bm = bytes.fromhex(m)
    
    # 圧縮したものをもとに戻す
    bmm = zlib.decompress(bm)
    
    # 最後にbytes型を文字列に戻す
    bmmm = bmm.decode("utf-8")
    print(bmmm)
    
[/code]

しかし、Python2.7で実行すると

`m = message_test.hex()`の行で  
`'str' object has no attribute 'hex'`と言われて実行できませんでした。

`bytes.fromhex(m)`もちゃんと動作しないようです。  
Python2.7で上記のコードを動作させるにはどのように書けば良いですか？




こちらの記事を参考に、`.encode('hex')`と`.decode('hex')`で出来るようです。  
[Python - バイナリファイル、16進数(文字列メソッド(encode、decode)、bytesメソッド(hex、fromhex))
...](https://www.mkamimura.com/2018/08/python-16encodedecodebyteshexfromhex.html)

> > たとえば、 "ABCD".encode('hex') だと、"41424344"となる。逆はdecodeで。  
>  あとは例えば、python -c "print("\x00" * 0x10)"
> でパイプライン使ったり、リダイレクトしたりすると、制御文字やNULL文字の入力されたバイナリファイルを簡単に入力したり保存できたりする。
>
> そんなこと出来たっけ？と気になったので試してみた。  
>  ...途中省略...  
>  出来た。という事で、双葉 杏さんの話はpython 2.7での話だったみたい。(という事で、私の勘違い。m(_ _)m)

ちなみに @metropolis さん回答の`(package 内で encode()
メソッドを使うことができないためです)`というのがどういうことなのかは知識が無く理解できていませんが、以下のように簡単なスクリプトでそのまま使う分には出来るようです。

該当の2行だけ変えています。

[code]

    import zlib
    
    message = "ababtestabab"
    
    message_test = zlib.compress(message.encode("utf-8"))
    
    # compress()により圧縮したbytesをhex()により16進表記の文字列にする
    #### m = message_test.hex()
    m = message_test.encode('hex') #### for Python 2.7
    
    # ここからは逆変換
    # 16進表記の文字列からbytes型へ変換する
    #### bm = bytes.fromhex(m)
    bm = m.decode('hex')           #### for Python 2.7
    
    # 圧縮したものをもとに戻す
    bmm = zlib.decompress(bm)
    
    # 最後にbytes型を文字列に戻す
    bmmm = bmm.decode("utf-8")
    print(bmmm)
    
[/code]




こちらの記事を参考に、`.encode('hex')`と`.decode('hex')`で出来るようです。  
[Python - バイナリファイル、16進数(文字列メソッド(encode、decode)、bytesメソッド(hex、fromhex))
...](https://www.mkamimura.com/2018/08/python-16encodedecodebyteshexfromhex.html)

> > たとえば、 "ABCD".encode('hex') だと、"41424344"となる。逆はdecodeで。  
>  あとは例えば、python -c "print("\x00" * 0x10)"
> でパイプライン使ったり、リダイレクトしたりすると、制御文字やNULL文字の入力されたバイナリファイルを簡単に入力したり保存できたりする。
>
> そんなこと出来たっけ？と気になったので試してみた。  
>  ...途中省略...  
>  出来た。という事で、双葉 杏さんの話はpython 2.7での話だったみたい。(という事で、私の勘違い。m(_ _)m)

ちなみに @metropolis さん回答の`(package 内で encode()
メソッドを使うことができないためです)`というのがどういうことなのかは知識が無く理解できていませんが、以下のように簡単なスクリプトでそのまま使う分には出来るようです。

該当の2行だけ変えています。

[code]

    import zlib
    
    message = "ababtestabab"
    
    message_test = zlib.compress(message.encode("utf-8"))
    
    # compress()により圧縮したbytesをhex()により16進表記の文字列にする
    #### m = message_test.hex()
    m = message_test.encode('hex') #### for Python 2.7
    
    # ここからは逆変換
    # 16進表記の文字列からbytes型へ変換する
    #### bm = bytes.fromhex(m)
    bm = m.decode('hex')           #### for Python 2.7
    
    # 圧縮したものをもとに戻す
    bmm = zlib.decompress(bm)
    
    # 最後にbytes型を文字列に戻す
    bmmm = bmm.decode("utf-8")
    print(bmmm)
    
[/code]

