Ao iterar sobre um
bytes
valor, você obtém números inteiros; estes são trivialmente convertidos em notação hexadecimal:def convert(value: bytes):
return ''.join([f'\\x{b:02x}' for b in value])
Observe que isso produz uma string com barras invertidas literais,
x
caracteres e caracteres de dígitos hexadecimais . Não é mais um bytes
valor. Demonstração:
>>> print(convert(b'\x01\x02\x41'))
\x01\x02\x41
Só para ter certeza, você não precisa se preocupar com os
bytes
valor . O repr()
representação de um bytes
O objeto sempre usará caracteres ASCII quando o valor do byte for o de um ponto de código ASCII imprimível. Isso não significa que o valor foi alterado. b'\x01\x02\x41'
é igual a b'\x01\x02A'
. O protocolo Redis não sabe nada sobre \x<HH>
seqüências de escape, então não tente enviar a string acima pelo fio. As sequências de escape que você produz são sequências de strings do shell bash , e assim como as strings do Python, você não precisa usar escapes . Como em Python, para bash as strings
"\x01\x02A"
e "\x01\x02\x41"
têm valores iguais. Eles só fazem sentido quando você está passando as strings de chave e valor na linha de comando, não em um arquivo de texto que você canaliza para redis-cli
. Além disso, observe que o
redis-cli --pipe
comando recebe entrada bruta do protocolo Redis , não a sintaxe de comando do Redis, consulte a Inserção em massa do Redis documentação. Este protocolo não use \xhh
sequências, pois não usa notação de shell. Em vez disso, use a seguinte função para gerar
SET
bruto comandos: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''
])
Para um
SET
comando, use raw_protocol('SET', keybytes, valuebytes)
e escreva os dados binários que isso produz em um arquivo aberto no modo binário.