bytes
を反復処理する場合 値、整数を取得します。これらは簡単に16進表記に変換されます:
def convert(value: bytes):
return ''.join([f'\\x{b:02x}' for b in value])
これにより、リテラルのバックスラッシュx
を含む文字列が生成されることに注意してください。 文字と16進数の文字 。 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>
について何も知りません エスケープシーケンスなので、上記の文字列をネットワーク経由で送信しないでください。
生成するエスケープシーケンスは、bashシェル文字列シーケンスです。 、Python文字列と同様に、エスケープを使用する必要はありません 。 Pythonの場合と同様に、文字列をBashするには"\x01\x02A"
および"\x01\x02\x41"
等しい値を持っています。これらは、コマンドラインでキーと値の文字列を渡す場合にのみ意味があり、redis-cli
にパイプするテキストファイルでは意味がありません。 。
さらに、redis-cli --pipe
に注意してください コマンドは生のRedisプロトコル入力を受け取ります 、Redisコマンド構文ではありません。 RedisMass Insertionを参照してください。 ドキュメンテーション。このプロトコルはしません \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)
を使用します 生成されたバイナリデータを、バイナリモードで開いたファイルに書き出します。