sql >> データベース >  >> NoSQL >> Redis

バイトを16進文字列全体に変換するにはどうすればよいですか?

    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)を使用します 生成されたバイナリデータを、バイナリモードで開いたファイルに書き出します。




    1. MongoDBはストレージサイズを制限しますか?

    2. 1回のクエリでmongoから複数のドキュメントを削除する

    3. CDPプライベートクラウドベース7とCDH5の運用データベースのパフォーマンスの向上

    4. nodejs非同期リクエストを使用したredisのforループ