Python3 中的字符串作为字节
假设我有一个字符串(本来应该是字节):
"b'YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo='"
我想解码它,但系统说必须是字节,所以我得想办法把它转换成这个样子
b'YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo='
我正在做一个聊天客户端,当它发送数据(字节)时,经过服务器后变成了字符串,而当它到达另一边时,就无法解码了
另外,这个数据是经过加密的,解码后会得到一些随机的数字和字母,客户端会负责解密
哦,对了,我不太确定'='这个符号是不是应该在这里,当我和朋友测试数据时,我得到了上面那个字符串,并且出现了说必须是字节的错误。
客户端的部分代码(只展示一行,其他的保密):
base64.b64decode(that_string).decode('ascii')
它主要使用ASCII编码,所以我觉得这样是对的,对吧?
更多信息:
base64.b64encode(message.encode('ascii'))
这里的消息是为了获取从另一边发送过来的字符串
Room.message(str(secretEncrypt(par, codes())))
我不知道我怎么会错过这个,它在发送之前已经转换成字符串了=.=
不过,它还是需要转换成字节,那我该怎么做呢?
3 个回答
问题出在这里:
Room.message(str(secretEncrypt(par, codes())))
secretEncrypt(...)
这个函数返回的是字节(bytes),但是你接着用 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
,但没有看到你其他的代码就无法确定)。
下面的内容非常有效
>>> 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!'
展示你是如何对字符串进行编码的
我说得对,不用想得太复杂。
这个字符串:
"b'YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo='"
只需要分开,比如:
string = "b'YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo='"
string = string.split("'")[1]
这样就能得到一个没有 b' 的字符串:
"YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo="
然后我只需要把它转成字节:
string = bytes(string, "ascii")
这样就能得到字符串外面的 b':
b"YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo="
顺便说一下,给那些说要破解我代码的人,里面有一些随机的无意义的东西和 ID 的信息,如果你能破解它,那也没什么用,反正这只是一个给小朋友玩的迷你聊天室游戏的聊天客户端。