Při iteraci přes bytes
hodnota, dostanete celá čísla; tyto jsou triviálně převedeny na hexadecimální zápis:
def convert(value: bytes):
return ''.join([f'\\x{b:02x}' for b in value])
Všimněte si, že to vytvoří řetězec s doslovnými zpětnými lomítky, x
znaky a znaky hexadecimálních číslic . Již to nejsou bytes
hodnotu.
Demo:
>>> print(convert(b'\x01\x02\x41'))
\x01\x02\x41
Pro jistotu si nemusíte dělat starosti s bytes
hodnotu . repr()
reprezentace bytes
objekt bude vždy používat znaky ASCII, když se stane, že hodnota bajtu je tisknutelná kódovým bodem ASCII. To neznamená, že se hodnota změnila. b'\x01\x02\x41'
se rovná b'\x01\x02A'
. Protokol Redis neví nic o \x<HH>
escape sekvence, takže se nepokoušejte odeslat výše uvedený řetězec po drátě.
Escape sekvence, které vytvoříte, jsou sekvence řetězců bash shell a stejně jako pythonovské řetězce nemusíte používat escape . Stejně jako v Pythonu, k Bashování řetězců "\x01\x02A"
a "\x01\x02\x41"
mít stejné hodnoty. Mají smysl pouze tehdy, když předáváte řetězce klíčů a hodnot na příkazovém řádku, nikoli v textovém souboru, který převádíte pomocí kanálu do redis-cli
.
Navíc mějte na paměti, že redis-cli --pipe
příkaz přebírá nezpracovaný vstup protokolu Redis , nikoli syntaxe příkazu Redis, viz Hromadné vkládání Redis dokumentace. Tento protokol není použijte \xhh
sekvencí, protože nepoužívá shellovou notaci.
Místo toho použijte následující funkci ke generování nezpracovaného SET
příkazy:
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''
])
Pro SET
příkaz, použijte raw_protocol('SET', keybytes, valuebytes)
a zapsat takto vytvořená binární data do souboru otevřeného v binárním režimu.