1

telnet サーバーを作成するために見つけたコードを使用して、Python ソケットを操作します。サーバーコードは正常に動作します。文字の問題を回避するために、クライアントとの間で 16 進文字列を送信する必要があります。次のようにクライアントにデータを送信すると:

conn.sendall('\x74\x65\x73\x74\x31\x32\x33\x0D\x0A')

また

test_var = '\x74\x65\x73\x74\x31\x32\x33\x0D\x0A'
conn.sendall(test_var)

それは完璧に機能します。文字列を作成して変数に格納しようとすると(次のような):

def recover_raw_data(data):

    data_list = []
    hex_list = []

    for items in data:
        data_list.append(ord(items))

    for items in data_list:
        hex_list.append("\\")
        value = '%02X' % int(items)
        hex_list.append("0x" + value)
    print hex_list   
    almost_final_data = "".join(hex_list)
    just_about_final_data = almost_final_data.replace('\\0x', '\\x')
    final_data = just_about_final_data
    print final_data
    conn.sendall(final_data)
    return()

この混乱の出力を印刷すると、正しいように見えます。Wireshark のキャプチャでは、ASCII ではなく文字どおりにパケットが送信されていることがわかります...

例えば\x31\x32\x33\x34\x35\x0D\x0A

私は .encode と、Google で見つけた他の多くのアイデアを試しました...機能する変数から文字列を作成できないのはなぜだろうか...どんな助けも大歓迎です。

4

1 に答える 1

1

A (Python2)strは一連のバイトです。たとえば、'\x31\x32\x33\x34\x35\x0D\x0A'は一連のバイトです。listに適用することで、どのバイトをより明確に確認できますstr:

In [26]: list('\x31\x32\x33\x34\x35\x0D\x0A')
Out[26]: ['1', '2', '3', '4', '5', '\r', '\n']

ご覧のとおり、ここには実際に 8 バイトがあります。'\x31'はすべて 1 バイトです。strそのため、バックスラッシュ文字"\\"と数字を結合してこれを再現することはできませんx: (例: raw string r'\x31\x32\x33\x34\x35\x0D\x0A'.)

In [28]: list(r'\x31\x32\x33\x34\x35\x0D\x0A')[:10]
Out[28]: ['\\', 'x', '3', '1', '\\', 'x', '3', '2', '\\', 'x']

の目的を理解しているかどうかわからないrecover_raw_dataので、おそらく次は間違っていますが、必要なのは次のとおりです。

def recover_raw_data(data):
    conn.sendall(data)

(そして、それが本当ならrecover_raw_dataconn.sendall十分なのでまったく必要ありません...)


実際には、コーデックxでデコードすることにより、リテラル文字列 (バックスラッシュと文字を含む) を目的の文字列に変換することができます。'string_escape'

In [30]: (r'\x31\x32\x33\x34\x35\x0D\x0A').decode('string_escape')
Out[30]: '12345\r\n'

しかし、私はあなたがこれを行う必要はないと思います。この困難を乗り越える前に、あなたdataはすでに正しい形になっているようです。


PS。recover_raw_dataへの入力がどのように見えるか、そしてそれに対して何をしたいかの例を示していただければ、おそらく を変更する方法を提案できrecover_raw_dataます。

于 2013-03-04T20:38:42.650 に答える