Ved iteration over en bytes
værdi, får du heltal; disse er trivielt konverteret til hex-notation:
def convert(value: bytes):
return ''.join([f'\\x{b:02x}' for b in value])
Bemærk, at dette producerer en streng med bogstavelige omvendte skråstreg, x
tegn og heksadecimale cifre . Det er ikke længere en bytes
værdi.
Demo:
>>> print(convert(b'\x01\x02\x41'))
\x01\x02\x41
Bare for at være sikker behøver du ikke at bekymre dig om bytes
værdi . repr()
repræsentation af en bytes
objekt vil altid bruge ASCII-tegn, når byteværdien tilfældigvis er den for et udskrivbart ASCII-kodepunkt. Det betyder ikke, at værdien ændres. b'\x01\x02\x41'
er lig med b'\x01\x02A'
. Redis-protokollen ved ikke noget om \x<HH>
escape-sekvenser, så prøv ikke at sende ovenstående streng over ledningen.
De escape-sekvenser, du producerer, er bash shell-strengsekvenser , og ligesom Python-strenge, behøver du ikke at bruge escapes . Som i Python, for at bash strengene "\x01\x02A"
og "\x01\x02\x41"
har lige værdier. De giver kun mening, når du sender nøgle- og værdistrengene på kommandolinjen, ikke i en tekstfil, du sender til redis-cli
.
Bemærk desuden, at redis-cli --pipe
kommandoen tager rå Redis protokol input , ikke Redis kommandosyntaks, se Redis Mass Insertion dokumentation. Denne protokol gør ikke brug \xhh
sekvenser, da den ikke bruger shell-notation.
Brug i stedet følgende funktion til at generere rå SET
kommandoer:
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''
])
For et SET
kommando, brug raw_protocol('SET', keybytes, valuebytes)
og skriv de binære data, dette producerer, til en fil, der åbnes i binær tilstand.