Beim Iterieren über bytes
Wert erhalten Sie ganze Zahlen; diese werden trivialerweise in Hex-Notation umgewandelt:
def convert(value: bytes):
return ''.join([f'\\x{b:02x}' for b in value])
Beachten Sie, dass dies eine Zeichenfolge mit literalen umgekehrten Schrägstrichen erzeugt, x
Zeichen und hexadezimale Ziffern . Es ist kein bytes
mehr Wert.
Demo:
>>> print(convert(b'\x01\x02\x41'))
\x01\x02\x41
Nur um sicherzugehen, brauchen Sie sich nicht um die bytes
zu kümmern Wert . Die repr()
Darstellung eines bytes
Das Objekt verwendet immer ASCII-Zeichen, wenn der Bytewert zufällig der eines druckbaren ASCII-Codepoints ist. Das bedeutet nicht, dass der Wert geändert wird. b'\x01\x02\x41'
ist gleich b'\x01\x02A'
. Das Redis-Protokoll weiß nichts über \x<HH>
Escape-Sequenzen, also versuchen Sie nicht, die obige Zeichenfolge über die Leitung zu senden.
Die erzeugten Escape-Sequenzen sind Bash-Shell-String-Sequenzen , und genau wie bei Python-Strings müssen Sie keine Escapezeichen verwenden . Wie in Python, um die Zeichenfolgen "\x01\x02A"
zu bashen und "\x01\x02\x41"
gleiche Werte haben. Sie sind nur sinnvoll, wenn Sie die Schlüssel- und Wertzeichenfolgen auf der Befehlszeile übergeben, nicht in einer Textdatei, die Sie an redis-cli
leiten .
Beachten Sie außerdem, dass die redis-cli --pipe
Der Befehl nimmt Rohdaten für das Redis-Protokoll entgegen , nicht die Redis-Befehlssyntax, finden Sie unter Masseneinfügung von Redis Dokumentation. Dieses Protokoll nicht Verwenden Sie \xhh
Sequenzen, da es keine Shell-Notation verwendet.
Verwenden Sie stattdessen die folgende Funktion, um rohes SET
zu generieren Befehle:
def raw_protocol(cmd: str, *args: bytes):
return b'\r\n'.join([
f'*{len(args) + 1}\r\n${len(cmd)}\r\n{cmd}'.encode(),
*(bv for a in args for bv in (b'$%d' % len(a), a)),
b''
])
Für ein SET
verwenden Sie raw_protocol('SET', keybytes, valuebytes)
und schreibe die erzeugten Binärdaten in eine im Binärmodus geöffnete Datei.