Bij iteratie van meer dan bytes waarde, je krijgt gehele getallen; deze worden triviaal omgezet in hexadecimale notatie:
def convert(value: bytes):
return ''.join([f'\\x{b:02x}' for b in value])
Merk op dat dit een string oplevert met letterlijke backslashes, x tekens en hexadecimale cijfers . Het is niet langer een bytes waarde.
Demo:
>>> print(convert(b'\x01\x02\x41'))
\x01\x02\x41
Voor de zekerheid hoef je je geen zorgen te maken over de bytes waarde . De repr() weergave van een bytes object zal altijd ASCII-tekens gebruiken wanneer de bytewaarde die van een afdrukbaar ASCII-codepunt is. Dat betekent niet dat de waarde wordt gewijzigd. b'\x01\x02\x41' is gelijk aan b'\x01\x02A' . Het Redis-protocol weet niets over \x<HH> ontsnappingsreeksen, dus probeer de bovenstaande string niet over de draad te sturen.
De escape-reeksen die u maakt, zijn bash shell-reeksreeksen , en net als Python-strings hoef je geen escapes te gebruiken . Net als in Python, om de strings te bashen "\x01\x02A" en "\x01\x02\x41" gelijke waarden hebben. Ze hebben alleen zin als je de key- en value-strings op de opdrachtregel doorgeeft, niet in een tekstbestand dat je doorgeeft aan redis-cli .
Houd er bovendien rekening mee dat de redis-cli --pipe opdracht vereist onbewerkte Redis-protocolinvoer , niet de Redis-opdrachtsyntaxis, zie de Redis Mass Insertion documentatie. Dit protocol doet niet gebruik \xhh reeksen, omdat het geen shell-notatie gebruikt.
Gebruik in plaats daarvan de volgende functie om onbewerkte SET . te genereren commando's:
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''
])
Voor een SET commando, gebruik raw_protocol('SET', keybytes, valuebytes) en schrijf de binaire gegevens die dit oplevert weg naar een bestand dat in binaire modus is geopend.