Podczas iteracji po bytes
wartość, otrzymujesz liczby całkowite; są one trywialnie konwertowane na notację szesnastkową:
def convert(value: bytes):
return ''.join([f'\\x{b:02x}' for b in value])
Zauważ, że tworzy to ciąg znaków z dosłownymi ukośnikami odwrotnymi, x
znaki i cyfry szesnastkowe . To już nie jest bytes
wartość.
Demo:
>>> print(convert(b'\x01\x02\x41'))
\x01\x02\x41
Aby mieć pewność, nie musisz się martwić o bytes
wartość . repr()
reprezentacja bytes
obiekt będzie zawsze używał znaków ASCII, gdy wartość bajtu jest wartością drukowanego punktu kodowego ASCII. To nie znaczy, że wartość się zmienia. b'\x01\x02\x41'
jest równe b'\x01\x02A'
. Protokół Redis nie wie nic o \x<HH>
sekwencje specjalne, więc nie próbuj wysyłać powyższego ciągu przez przewód.
Tworzone sekwencje specjalne to sekwencje ciągów powłoki bash , i tak jak w Pythonie, nie musisz używać znaków specjalnych . Podobnie jak w Pythonie, aby Bashować ciągi "\x01\x02A"
i "\x01\x02\x41"
mają równe wartości. Mają sens tylko wtedy, gdy przekazujesz ciągi kluczy i wartości w wierszu poleceń, a nie w pliku tekstowym, który przekierujesz do redis-cli
.
Co więcej, pamiętaj, że redis-cli --pipe
polecenie pobiera surowe dane wejściowe protokołu Redis , a nie składnię polecenia Redis, zobacz Redis Mass Insertion dokumentacja. Ten protokół nie użyj \xhh
sekwencji, ponieważ nie używa notacji powłoki.
Zamiast tego użyj następującej funkcji, aby wygenerować surowy SET
polecenia:
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''
])
Dla SET
polecenie, użyj raw_protocol('SET', keybytes, valuebytes)
i wypisz otrzymane dane binarne do pliku otwartego w trybie binarnym.