sql >> Database >  >> NoSQL >> Redis

Hoe kan ik een bytes converteren naar een hele hex-tekenreeks?

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.




  1. Mongoose unieke index op subdocument

  2. Vind documenten met een matrix die geen specifieke waarde bevat

  3. Hoe kan ik mongodb opvragen met mongoid/rails zonder time-out?

  4. Operationele databasebeveiliging - deel 1