Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Jak mogę przekonwertować bajty na cały ciąg szesnastkowy?

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Klawisze Redis nie są wyświetlane podczas korzystania z fasady pamięci podręcznej w Laravel

  2. Łączność SSL z Redis za pomocą StackExchange.Redis

  3. Indeksowanie przy użyciu posortowanych zestawów Redis

  4. Czy „StackExchange.Redis.ConnectionMultiplexer” powinien być „AddSingleton” czy „AddScope” w iniekcji zależności .NET Core?

  5. Railsy, ​​jak sprawdzić, czy pracownik sidekiq skończył z perform_async