Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Wie kann ich ein Byte in einen ganzen Hex-String umwandeln?

Beim Iterieren über bytes Wert erhalten Sie ganze Zahlen; diese werden trivialerweise in Hex-Notation umgewandelt:

def convert(value: bytes):
    return ''.join([f'\\x{b:02x}' for b in value])

Beachten Sie, dass dies eine Zeichenfolge mit literalen umgekehrten Schrägstrichen erzeugt, x Zeichen und hexadezimale Ziffern . Es ist kein bytes mehr Wert.

Demo:

>>> print(convert(b'\x01\x02\x41'))
\x01\x02\x41

Nur um sicherzugehen, brauchen Sie sich nicht um die bytes zu kümmern Wert . Die repr() Darstellung eines bytes Das Objekt verwendet immer ASCII-Zeichen, wenn der Bytewert zufällig der eines druckbaren ASCII-Codepoints ist. Das bedeutet nicht, dass der Wert geändert wird. b'\x01\x02\x41' ist gleich b'\x01\x02A' . Das Redis-Protokoll weiß nichts über \x<HH> Escape-Sequenzen, also versuchen Sie nicht, die obige Zeichenfolge über die Leitung zu senden.

Die erzeugten Escape-Sequenzen sind Bash-Shell-String-Sequenzen , und genau wie bei Python-Strings müssen Sie keine Escapezeichen verwenden . Wie in Python, um die Zeichenfolgen "\x01\x02A" zu bashen und "\x01\x02\x41" gleiche Werte haben. Sie sind nur sinnvoll, wenn Sie die Schlüssel- und Wertzeichenfolgen auf der Befehlszeile übergeben, nicht in einer Textdatei, die Sie an redis-cli leiten .

Beachten Sie außerdem, dass die redis-cli --pipe Der Befehl nimmt Rohdaten für das Redis-Protokoll entgegen , nicht die Redis-Befehlssyntax, finden Sie unter Masseneinfügung von Redis Dokumentation. Dieses Protokoll nicht Verwenden Sie \xhh Sequenzen, da es keine Shell-Notation verwendet.

Verwenden Sie stattdessen die folgende Funktion, um rohes SET zu generieren Befehle:

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 ein SET verwenden Sie raw_protocol('SET', keybytes, valuebytes) und schreibe die erzeugten Binärdaten in eine im Binärmodus geöffnete Datei.