Redis
 sql >> Base de données >  >> NoSQL >> Redis

Comment pourrais-je convertir un octet en une chaîne hexadécimale entière?

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.