70980


すみませんが、お助け願います。  
Python2.7 で、文字などを16進で画面に表示すると、`\x01` のような文字が表示されます。  
この `\x01` の文字を変数に取得したいのですが、どのようにすればいいのか分かりません。

[code]

    >>> from struct import *
    >>> pack('hhl', 1,2,3)
    '\x01\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00'
    
[/code]

上記の `\x01\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00`
を変数に入れたい。

[code]

    a = pack('hhl', 1,2,3)
    len(a)
    
[/code]

だと、16 になってしまい、この変数のバイト数になってしまう。  
そうではなく、`\x` も文字なので len を 64 で取りたいのです。

以上になります。よろしくお願いします。


CC BY-SA 4.0
2020-10-07T03:04:06.043
70978
2020-10-07T04:22:03.483
2020-10-07T04:22:03.483
3060
42217
question
python python2
Python2.7 バイト表記された文字の取得が分からない。


`"\x01\x00～"` という文字列ではなく、`"\\x01\\x00～"` という文字列として取得したい、という意味だと理解しました。

## 16 進表記に自分で変換する方法

文字列からコードポイントを得られる組み込み関数
[`ord`](https://docs.python.org/2/library/functions.html#ord) などを使えば、この 16
進表記の文字列を自作することができます。

[code]

    from struct import *
    a = ''.join(map(lambda c: '\\x%02x' % ord(c), pack('hhl', 1, 2, 3)))
    print(a)
    print(len(a))  # 64 が出力されます。
    
[/code]

※マルチバイト文字が含まれる場合はこれだと上手くいきません。また Python 3 では文字列の扱いが変わっているためやはり上手くいきません。

## `repr` を使う方法

組み込み関数 [`repr`](https://docs.python.org/2/library/functions.html#func-repr)
を使えばインタプリタで表示される文字列を得ることができます。常に 16 進表記になるかまでドキュメントされていなかった気がするので、
**この挙動に依存して良いのであれば** 次のように書くことができます。

[code]

    from struct import *
    a = repr(pack('hhl', 1, 2, 3))[1:-1]
    print(a)
    print(len(a))  # 64 が出力されます。
    
[/code]

* * *

補足：Python 2.x 系列は既に End of Life となっており、積極的にはメンテナンスされていません。可能であれば Python 3.x
系列への移行をお勧めします。


CC BY-SA 4.0
2020-10-07T04:09:22.080
70980
2020-10-07T04:09:22.080
19110
70978
answer