1

文字列(バイトであるはずです)を取得したとしましょう:

"b'YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo='"

デコードしたいのですが、バイト単位である必要があると言われているので、何とかしてこれに変換する必要があります

b'YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo='

私はチャットクライアントで作業していますが、データ(バイト)を送信すると、サーバーを通過するときに何らかの形で文字列になり、反対側に到達するとデコードできません

ps: それは ENCRYPT であり、乱数と文字を与えるデコードであり、クライアントはそれを解読します

ああ、そして、「=」記号がそこにあるはずかどうかはよくわかりません。私と友人の間のテストでデータを取得したとき、その文字列(一番上のもの)のように取得しましたバイト単位である必要があるというエラー。

クライアントのコードの一部 (すべての人に見せるために 1 行だけ、残りは秘密です):

base64.b64decode(that_string).decode('ascii')

それは主にASCIIを使用しているので、これは正しいと思いますよね?

より詳しい情報:

base64.b64encode(message.encode('ascii'))

ここのメッセージは、反対側から送信された文字列を取得するためのものです

Room.message(str(secretEncrypt(par, codes())))

これを見逃す方法がわかりません。=.= を送信する前に str を送信しますが、それでもバイトに変換する必要があります。

4

3 に答える 3

3

以下は非常にうまくいきます

>>> import base64
>>> s = "Hello StackOwerflow!"
>>> b = s.encode()
>>> c = base64.b64encode(b)
>>> c
b'SGVsbG8gU3RhY2tPd2VyZmxvdyE='
>>> b1 = base64.b64decode(c) 
>>> b1
b'Hello StackOwerflow!'
>>> b1.decode()
'Hello StackOwerflow!'

文字列をエンコードする方法を示します

于 2013-02-03T21:07:53.130 に答える
3

問題はここにあります:

Room.message(str(secretEncrypt(par, codes())))

secretEncrypt(...)バイトを返しますが、それはあなたが望むことstr(b"thereturnvalue")をしませ:

>>> my_bytes = b"abc"
>>> type(my_bytes)
<class 'bytes'>
>>> str(my_bytes)
"b'abc'"
>>> type(str(my_bytes))
<class 'str'>

reprバイトの文字列表現( )を文字列に入れているため、文字列はb"

これを修正する最善の方法は、周囲のコードによって異なります。次のいずれか:

  • secretEncrypt関数がバイトを返す場合は、バイトも受け入れるようにします (そしてキャストRoom.messageを削除します)。str(...)
  • キャストの必要性を取り除き、文字列をsecretEncrypt返すようにしますstr(...)
  • 最も洗練されていない解決策: から返されたバイトをデコードsecretEncryptし、文字列に変換します。このようなもの:

    encrypted = secretEncrypt(par, codes())
    Room.message(encrypted.decode("whatever-encoder-was-used"))
    

    テキストエンコーディングはどこにありますかwhatever-encoding-was-used(おそらくutf-8またはasciiですが、コードの残りの部分を見ないとわかりません)

于 2013-02-03T21:55:01.397 に答える