2016-09-22 22 views
2

別の文字列に追加する変数にエスケープ文字を追加し、エフェクトを適用する必要があります。これは私が持っているものです。Pythonの変数にエスケープ文字を追加する

ので
h1 = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'] 
h2 = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'] 

h3 = list(itertools.product(h1, h2)) 
h4 = [] 

for item in h3: 
    h4.append(''.join(item)) 

temp = r'\x' + str(h4[0]) + '\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c' 

私は16進値HHで文字を必要とするが、私はこれが以外にも、\ X私が見えることはできませんんPythonで何かを見つけるように見えることはできませんXHを\している場合変数に使う

提案がありますか?

+0

なぜ、すべての製品を計算していますが、1つの値だけを使用していますか? – ShadowRanger

+0

明確化:あなたは本当に "エスケープ"したくありません。エスケープは、文字列リテラルが生のバイト値(0〜255)または生のUnicode序数(Py2 'unicode'またはPy3' str'の場合)を表すために、実際にエスケープコードを作成して桁をバイトに変換する必要はありません'/' str'値を返します。答えはあなたがエスケープをスキップして実際に欲しいものを得る方法を説明していますか? – ShadowRanger

+0

[XY problem](http://xyproblem.info/) – kindall

答えて

0

文字にその数を変換するために、あなたの進値が整数に変換し、chr()する用途int()は:

import itertools 

hexdigits = "123456789abcdef" 

for dig1, dig2 in itertools.product(hexdigits, hexdigits): 
    char = chr(int(dig1 + dig2, 16)) 
    temp = char + '\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c' 
1

int/chrコール(あなたがより多くを使用していると仮定を繰り返し多少速くソリューション

import itertools 
import binascii 

hexdigits = "123456789abcdef" 
completehex = ''.join(map(''.join, itertools.product(hexdigits, repeat=2))) 
completebytes = binascii.unhexlify(completehex) 

この意志バルクデコード生のバイト値にすべてのhexpairs(「ESCを:ちょうど生成された第1バイト)は、完全な16進文字列を作成し、すべてを一度に解析することですあなたが望む ")、completebytes'\x00\x01\x02\x03...\xfd\xfe\xff'になります。

もちろん、この特定の場合(実際の問​​題がすべてのバイト値を順番に生成しているだけではない場合)は、さらに単純化することができます。

# Py3 
completebytes = bytes(range(256)) 

# On Py2, bytes is alias for str, so must use bytearray first to accept iterable of int 
completebytes = bytes(bytearray(range(256))) 

それとも、ただ楽しみのために、最速の方法maketransを乱用:

# Py3: 
completebytes = bytes.maketrans(b'', b'') # Add .decode('latin-1') if you really want str 

# Py2: 
import string 
completebytes = string.maketrans('', '') 
0

ここでは、OPの質問に答えるために変換する方法である、エスケープ表記を使用して、文字

h = '11' 
temp = eval(r"'\x" + h + "'") 

に2つの16進数字を含む文字列ことではありません、しかし、変換を行うための最善の方法(他の回答を参照してください)。私はchr(int(h,16))を提案します。もう一つの方法は、文字列の代わりに整数を使用することですh=0x11temp = chr(h)

+1

実際にエスケープされたリテラルを作成してPythonで処理したい場合は、['ast.literal_eval'](https://docs.python.org/3/ ( 'string_escape' /' unicode_escape'コーデックで) 'decode 'します(https(/ lib/ast.html#ast.literal_eval)は' eval'よりも優れています://docs.python.org/2/library/codecs.html#python-specific-encodings)(Py3では、後者のみが存在します)より良いです。ちょうど私が 'eval'の前に見るこれらのより良いオプションについて言及したいと思った。 'eval'は任意の階層の絶対的な_bottom_になければなりません。 – ShadowRanger

+0

あなたは正しいです。それは私が「これは最善の方法ではない」と書いたときの意味です(私はおそらく十分に主張しませんでした)。最後のオプションとして 'eval'を使うこともお勧めします。しかし、OPの質問は、変数にエスケープ文字を追加する方法でした。 –

関連する問題