Lors de l'itération sur un bytes
valeur, vous obtenez des entiers ; ceux-ci sont trivialement convertis en notation hexadécimale :
def convert(value: bytes):
return ''.join([f'\\x{b:02x}' for b in value])
Notez que cela produit une chaîne avec des barres obliques inverses littérales, x
caractères et chiffres hexadécimaux . Ce n'est plus un bytes
valeur.
Démo :
>>> print(convert(b'\x01\x02\x41'))
\x01\x02\x41
Juste pour être sûr, vous n'avez pas à vous soucier des bytes
valeur . Le repr()
représentation d'un bytes
L'objet utilisera toujours des caractères ASCII lorsque la valeur d'octet se trouve être celle d'un point de code ASCII imprimable. Cela ne signifie pas que la valeur est modifiée. b'\x01\x02\x41'
est égal à b'\x01\x02A'
. Le protocole Redis ne sait rien de \x<HH>
séquences d'échappement, alors n'essayez pas d'envoyer la chaîne ci-dessus sur le fil.
Les séquences d'échappement que vous produisez sont des séquences de chaînes shell bash , et tout comme les chaînes Python, vous n'avez pas besoin d'utiliser des échappements . Comme en Python, pour Bash les chaînes "\x01\x02A"
et "\x01\x02\x41"
ont des valeurs égales. Ils n'ont de sens que lorsque vous transmettez les chaînes de clé et de valeur sur la ligne de commande, et non dans un fichier texte que vous dirigez vers redis-cli
.
De plus, veuillez noter que le redis-cli --pipe
la commande prend l'entrée brute du protocole Redis , et non la syntaxe de la commande Redis, voir Insertion en masse Redis Documentation. Ce protocole ne fait pas utilisez \xhh
séquences, car il n'utilise pas la notation shell.
Au lieu de cela, utilisez la fonction suivante pour générer un SET
brut commandes :
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''
])
Pour un SET
commande, utilisez raw_protocol('SET', keybytes, valuebytes)
et écrivez les données binaires que cela produit dans un fichier ouvert en mode binaire.