Saat mengulangi bytes
nilai, Anda mendapatkan bilangan bulat; ini sepele dikonversi ke notasi heksadesimal:
def convert(value: bytes):
return ''.join([f'\\x{b:02x}' for b in value])
Perhatikan bahwa ini menghasilkan string dengan garis miring terbalik literal, x
karakter dan karakter digit heksadesimal . Ini bukan lagi bytes
nilai.
Demo:
>>> print(convert(b'\x01\x02\x41'))
\x01\x02\x41
Untuk memastikan, Anda tidak perlu khawatir tentang bytes
nilai . repr()
representasi dari bytes
objek akan selalu menggunakan karakter ASCII ketika nilai byte adalah nilai dari titik kode ASCII yang dapat dicetak. Bukan berarti nilainya berubah. b'\x01\x02\x41'
sama dengan b'\x01\x02A'
. Protokol Redis tidak tahu apa-apa tentang \x<HH>
escape sequence, jadi jangan coba mengirim string di atas melalui kabel.
Urutan escape yang Anda hasilkan adalah urutan string shell bash , dan seperti string Python, Anda tidak perlu menggunakan escapes . Seperti di Python, untuk Bash string "\x01\x02A"
dan "\x01\x02\x41"
memiliki nilai yang setara. Mereka hanya masuk akal ketika Anda meneruskan string kunci dan nilai pada baris perintah, bukan dalam file teks yang Anda pipa ke redis-cli
.
Selain itu, harap dicatat bahwa redis-cli --pipe
perintah mengambil masukan protokol Redis mentah , bukan sintaks perintah Redis, lihat Penyisipan Massal Redis dokumentasi. Protokol ini tidak gunakan \xhh
urutan, karena tidak menggunakan notasi shell.
Sebagai gantinya, gunakan fungsi berikut untuk menghasilkan SET
mentah perintah:
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''
])
Untuk SET
perintah, gunakan raw_protocol('SET', keybytes, valuebytes)
dan tuliskan data biner yang dihasilkannya ke file yang dibuka dalam mode biner.