При переборе значения 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последовательности , и, как и строки Python, вам не нужно использовать экранированные символы .Как и в 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)
и запишите полученные двоичные данные в файл, открытый в двоичном режиме.