Khi lặp qua một bytes
giá trị, bạn nhận được số nguyên; chúng được chuyển đổi nhỏ thành ký hiệu hex:
def convert(value: bytes):
return ''.join([f'\\x{b:02x}' for b in value])
Lưu ý rằng điều này tạo ra một chuỗi có dấu gạch chéo ngược theo nghĩa đen, x
ký tự và ký tự chữ số thập lục phân . Nó không còn là bytes
giá trị.
Demo:
>>> print(convert(b'\x01\x02\x41'))
\x01\x02\x41
Chỉ để đảm bảo rằng bạn không cần phải lo lắng về bytes
giá trị . repr()
đại diện của một bytes
đối tượng sẽ luôn sử dụng các ký tự ASCII khi giá trị byte xảy ra là của mã điểm ASCII có thể in được. Điều đó không có nghĩa là giá trị bị thay đổi. b'\x01\x02\x41'
bằng b'\x01\x02A'
. Giao thức Redis không biết gì về \x<HH>
trình tự thoát, vì vậy đừng cố gửi chuỗi trên qua dây.
Các chuỗi thoát mà bạn tạo là chuỗi chuỗi bash shell và cũng giống như chuỗi Python, bạn không cần phải sử dụng thoát . Như trong Python, để Bash các chuỗi "\x01\x02A"
và "\x01\x02\x41"
có giá trị bằng nhau. Chúng chỉ có ý nghĩa khi bạn chuyển các chuỗi khóa và giá trị trên dòng lệnh, không phải trong tệp văn bản mà bạn chuyển đến redis-cli
.
Hơn nữa, xin lưu ý rằng redis-cli --pipe
lệnh nhận đầu vào giao thức Redis thô , không phải cú pháp lệnh Redis, hãy xem Redis Mass Insertion tài liệu. Giao thức này không sử dụng \xhh
trình tự, vì nó không sử dụng ký hiệu shell.
Thay vào đó, hãy sử dụng hàm sau để tạo SET
thô lệnh:
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''
])
Đối với một SET
lệnh, sử dụng raw_protocol('SET', keybytes, valuebytes)
và ghi dữ liệu nhị phân mà dữ liệu này tạo ra vào một tệp được mở ở chế độ nhị phân.