sql >> Databasteknik >  >> NoSQL >> Redis

Hur kunde jag konvertera en byte till en hel hex-sträng?

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.




  1. MongoDB $dateToParts

  2. gränser för antalet samlingar i databaser

  3. mongokopia från en samling till en annan (på samma db)

  4. phpredis-tillägget fungerar inte, det går inte att ladda 'redis.so'