Python3 中的字符串作为字节

1 投票
3 回答
3245 浏览
提问于 2025-04-17 14:38

假设我有一个字符串(本来应该是字节):

"b'YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo='"

我想解码它,但系统说必须是字节,所以我得想办法把它转换成这个样子

b'YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo='

我正在做一个聊天客户端,当它发送数据(字节)时,经过服务器后变成了字符串,而当它到达另一边时,就无法解码了

另外,这个数据是经过加密的,解码后会得到一些随机的数字和字母,客户端会负责解密

哦,对了,我不太确定'='这个符号是不是应该在这里,当我和朋友测试数据时,我得到了上面那个字符串,并且出现了说必须是字节的错误。

客户端的部分代码(只展示一行,其他的保密):

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

它主要使用ASCII编码,所以我觉得这样是对的,对吧?

更多信息:

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

这里的消息是为了获取从另一边发送过来的字符串

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

我不知道我怎么会错过这个,它在发送之前已经转换成字符串了=.=

不过,它还是需要转换成字节,那我该怎么做呢?

3 个回答

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-8ascii,但没有看到你其他的代码就无法确定)。

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!'

展示你是如何对字符串进行编码的

0

我说得对,不用想得太复杂。

这个字符串:

"b'YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo='"

只需要分开,比如:

string = "b'YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo='"
string = string.split("'")[1]

这样就能得到一个没有 b' 的字符串:

"YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo="

然后我只需要把它转成字节:

string = bytes(string, "ascii")

这样就能得到字符串外面的 b':

b"YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo="

顺便说一下,给那些说要破解我代码的人,里面有一些随机的无意义的东西和 ID 的信息,如果你能破解它,那也没什么用,反正这只是一个给小朋友玩的迷你聊天室游戏的聊天客户端。

撰写回答