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.