bytes
. पर पुनरावृति करते समय मान, आपको पूर्णांक मिलते हैं; ये तुच्छ रूप से हेक्स नोटेशन में परिवर्तित हो जाते हैं:
def convert(value: bytes):
return ''.join([f'\\x{b:02x}' for b in value])
ध्यान दें कि यह शाब्दिक बैकस्लैश, x
. के साथ एक स्ट्रिंग उत्पन्न करता है वर्ण और हेक्साडेसिमल अंक वर्ण . यह अब bytes
नहीं है मूल्य।
डेमो:
>>> print(convert(b'\x01\x02\x41'))
\x01\x02\x41
बस यह सुनिश्चित करने के लिए, आपको bytes
के बारे में चिंता करने की आवश्यकता नहीं है मूल्य . repr()
एक bytes
. का प्रतिनिधित्व ऑब्जेक्ट हमेशा ASCII वर्णों का उपयोग करेगा जब बाइट मान एक मुद्रण योग्य ASCII कोडपॉइंट का होता है। इसका मतलब यह नहीं है कि मूल्य बदल गया है। b'\x01\x02\x41'
b'\x01\x02A'
. के बराबर है . Redis प्रोटोकॉल \x<HH>
. के बारे में कुछ भी नहीं जानता है एस्केप सीक्वेंस, इसलिए उपरोक्त स्ट्रिंग को तार पर भेजने की कोशिश न करें।
आपके द्वारा उत्पन्न एस्केप अनुक्रम बैश शेल स्ट्रिंग अनुक्रम . हैं , और पायथन स्ट्रिंग्स की तरह, आपको एस्केप का उपयोग करने की आवश्यकता नहीं है . जैसा कि पायथन में है, स्ट्रिंग्स को बैश करने के लिए "\x01\x02A"
और "\x01\x02\x41"
समान मूल्य हैं। वे केवल तभी समझ में आते हैं जब आप कमांड लाइन पर कुंजी और मान स्ट्रिंग में गुजर रहे होते हैं, न कि उस टेक्स्ट फ़ाइल में जिसे आप redis-cli
पर पाइप करते हैं ।
इसके अलावा, कृपया ध्यान दें कि redis-cli --pipe
कमांड रॉ रेडिस प्रोटोकॉल इनपुट लेता है , रेडिस कमांड सिंटैक्स नहीं, रेडिस मास इंसर्शन . देखें दस्तावेज़ीकरण। यह प्रोटोकॉल नहीं करता है \xhh
. का उपयोग करें अनुक्रम, क्योंकि यह शेल नोटेशन का उपयोग नहीं करता है।
इसके बजाय, कच्चे SET
उत्पन्न करने के लिए निम्न फ़ंक्शन का उपयोग करें आदेश:
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''
])
SET
के लिए कमांड, उपयोग करें raw_protocol('SET', keybytes, valuebytes)
और इससे उत्पन्न होने वाले बाइनरी डेटा को बाइनरी मोड में खोली गई फ़ाइल में लिखें।