När du itererar över en bytes
värde, du får heltal; dessa konverteras trivialt till hex-notation:
def convert(value: bytes):
return ''.join([f'\\x{b:02x}' for b in value])
Observera att detta producerar en sträng med bokstavliga snedstreck, x
tecken och hexadecimala siffror . Det är inte längre en bytes
värde.
Demo:
>>> print(convert(b'\x01\x02\x41'))
\x01\x02\x41
Bara för att vara säker, du behöver inte oroa dig för bytes
värde . repr()
representation av en bytes
objekt kommer alltid att använda ASCII-tecken när bytevärdet råkar vara det för en utskrivbar ASCII-kodpunkt. Det betyder inte att värdet ändras. b'\x01\x02\x41'
är lika med b'\x01\x02A'
. Redis-protokollet vet ingenting om \x<HH>
escape-sekvenser, så försök inte skicka ovanstående sträng över tråden.
Escape-sekvenserna du producerar är bash-skalsträngsekvenser , och precis som Python-strängar, behöver du inte använda escapes . Som i Python, för att basha strängarna "\x01\x02A"
och "\x01\x02\x41"
ha lika värden. De är bara vettiga när du skickar in nyckel- och värdesträngarna på kommandoraden, inte i en textfil som du skickar till redis-cli
.
Observera dessutom att redis-cli --pipe
kommandot tar rå Redis-protokollindata , inte Redis kommandosyntax, se Redis Mass Insertion dokumentation. Detta protokoll gör inte använd \xhh
sekvenser, eftersom den inte använder skalnotation.
Använd istället följande funktion för att generera rå SET
kommandon:
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 en SET
kommando, använd raw_protocol('SET', keybytes, valuebytes)
och skriv ut de binära data som detta producerar till en fil som öppnas i binärt läge.