При итерация над bytes
стойност, получавате цели числа; те са тривиално преобразувани в шестнадесетична нотация:
def convert(value: bytes):
return ''.join([f'\\x{b:02x}' for b in value])
Имайте предвид, че това създава низ с буквални обратни наклонени черти, x
знаци и шестнадесетични цифри . Вече не е bytes
стойност.
Демо:
>>> print(convert(b'\x01\x02\x41'))
\x01\x02\x41
Само за да сте сигурни, не е нужно да се притеснявате за bytes
стойност . repr()
представяне на bytes
обектът винаги ще използва ASCII символи, когато стойността на байта е тази на ASCII кодова точка за печат. Това не означава, че стойността е променена. b'\x01\x02\x41'
е равно на b'\x01\x02A'
. Протоколът Redis не знае нищо за \x<HH>
escape последователности, така че не се опитвайте да изпращате горния низ по кабела.
Escape-последователностите, които създавате, са последователности от низове на bash shell , и точно като низовете на Python, не е нужно да използвате escapes . Както в Python, за Bash на низовете "\x01\x02A"
и "\x01\x02\x41"
имат равни стойности. Те имат смисъл само когато предавате низове с ключ и стойност в командния ред, а не в текстов файл, който изпращате към redis-cli
.
Освен това, моля, имайте предвид, че redis-cli --pipe
командата приема необработено въвеждане на Redis протокол , а не синтаксис на командата Redis, вижте Масово вмъкване на Redis документация. Този протокол не използвайте \xhh
последователности, тъй като не използва нотация на обвивката.
Вместо това използвайте следната функция, за да генерирате необработен SET
команди:
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''
])
За SET
команда, използвайте raw_protocol('SET', keybytes, valuebytes)
и запишете получените от това двоични данни във файл, отворен в двоичен режим.