2016-09-22 1 views
2

Ich muss ein Escape-Zeichen zu einer Variablen hinzufügen, die ich an eine andere Zeichenfolge angehängt habe und ihre Auswirkungen anwenden lassen. Das ist, was ich habe:Hinzufügen von Escape-Zeichen zu einer Variablen in 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' 

Also, wenn ich habe \ xh brauche ich den Charakter mit dem Wert hh hex aber ich kann nicht alles in Python scheinen zu finden, tut dies neben \ x, die ich nicht scheinen kann, für Variablen verwenden.

Irgendwelche Vorschläge?

+0

Warum berechnen Sie alle Produkte, aber nur einen Wert? – ShadowRanger

+0

Klarstellung: Sie wollen nicht wirklich "entkommen". Escapes sind für String-Literale, um rohe Byte-Werte (von 0 bis 255) oder unformatierte Unicode-Ordinalzahlen darzustellen (für Py2 "Unicode" oder Py3 "Str"), müssen Sie keinen Escape-Code machen, um Ordinale in Bytes zu konvertieren '/' str' Werte. Die Antworten erklären, wie Sie die Fluchten überspringen und bekommen, was Sie wirklich wollen? – ShadowRanger

+0

[XY-Problem] (http://xyproduct.info/) – kindall

Antwort

0

Verwenden int() Ihren Hex-Wert auf eine ganze Zahl zu konvertieren und dann chr() die Zahl ist, um ein Zeichen zu konvertieren:

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

eine etwas schnellere Lösung, die int/chr Anrufe wiederholt (Sie verwenden unter der Annahme, mehr als nur das erste Byte erzeugt wird) ist eine komplette Hexstring zu erstellen und es auf einmal analysieren:

import itertools 
import binascii 

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

Dies wird bulk dekodieren alle hexpairs in die roh-Byte-Werte (die „esc Affen "Sie wollen), so completebytes wäre '\x00\x01\x02\x03...\xfd\xfe\xff'.

Natürlich, für diesen speziellen Fall (wenn Ihr wirkliches Problem nicht nur alle möglichen Bytewerte in der Reihenfolge erzeugt), könnten Sie es noch weiter vereinfachen, weil Sie nur alle möglichen Bytewerte erzeugen:

# 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))) 

Oder einfach nur zum Spaß, die schnellstmögliche Weise maketrans missbrauchen:

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

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

die OP Frage zu beantworten, hier ist ein Weg, zu konvertieren, die Escape-Notation , Ein String zwei hexadezimale Ziffern, um ein Zeichen enthält,

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

Es ist jedoch nicht der beste Weg, um die Konvertierung zu tun (siehe andere Antworten). Ich würde vorschlagen, chr(int(h,16)). Ein anderer Weg wäre die Verwendung von Ganzzahlen anstelle von Strings h=0x11 und temp = chr(h).

+1

Wenn Sie tatsächlich Escape-Literale machen wollen und sie von Python verarbeiten lassen, ['ast.literal_eval'] (https://docs.python.org/3/ library/ast.html # ast.literal_eval) ist besser als 'eval' (vermeidet das' eval' Risiko der willkürlichen Codeausführung) und 'decode' mit [den' string_escape'/'unicode_escape' Codecs] (https : //docs.python.org/2/library/codecs.html#python-specific-encodings) (in Py3 existiert nur letzteres) ist es noch besser. Ich dachte nur, ich würde diese besseren Optionen erwähnen, bevor ich 'eval' betrachte; 'eval' sollte auf dem absoluten _Bottom_ einer Hierarchie von Optionen liegen. – ShadowRanger

+0

Sie haben Recht. Das meinte ich, als ich schrieb "Es ist nicht der beste Weg [...]" (ich habe wahrscheinlich nicht genug darauf bestanden). Ich würde auch empfehlen, 'eval' als letzte Option zu verwenden. Die OP-Frage lautete jedoch, wie Escape-Zeichen in einer Variablen hinzugefügt werden. –

Verwandte Themen