假设我得到了字符串(应该是一个字节):
"b'YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo='"
我想解码它,但它说它必须以字节为单位,所以我必须以某种方式将其转换为
b'YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo='
我在一个聊天客户端上工作,当它发送数据(字节)时,它在通过服务器时不知怎么变成了一个字符串,当它到达另一端时,它无法解码
ps:它是ENCRYPT,解码会给出随机数字和字母,客户端会解密它
哦,而且,我真的不知道'='符号是否应该在那里,当我在我和我朋友之间的一次测试中得到数据时,我得到了它,就像那个字符串(顶部的那个),错误是它必须以字节为单位。
客户端中的部分代码(只有一行向所有人显示,其余为秘密):
base64.b64decode(that_string).decode('ascii')
它主要使用ascii,所以我认为这是对的,对吧?
更多信息:
base64.b64encode(message.encode('ascii'))
这里的消息用于获取从另一侧发送的字符串
Room.message(str(secretEncrypt(par, codes())))
我不知道我怎么会错过这个,它在发送之前先str它==好吧,它仍然需要把它变成字节,我是怎么做到的?
以下内容对非常有效
>>> 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!'
显示如何对字符串进行编码
问题就在这里:
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
,但如果看不到代码的其余部分,就无法判断)
我是对的,没有必要过度考虑
字符串:
"b'YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo='"
只需要拆分,例如:
string = "b'YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo='"
string = string.split("'")[1]
这会让我得到一个没有b'的字符串:
"YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo="
然后我只需要字节它:
string = bytes(string, "ascii")
这会让我得到字符串外的b':
b"YzJGNVltYzJGNVltOTBlbk5oZVdKdmRIcHpZWGxpYjNSNmMyRjVZbTkwZW5OaGVXSnZkSHB6WVhsaWIzUjZjMkY1WW05MGVnOTBlblJsYzNRPXNheWJvdHo="
ps:对于那些说要破解我的代码的人来说,这是随机的id转储到其中的繁琐事情,如果你设法破解它,它没有多大用处,而且无论如何,它只是一个聊天客户端,用于儿童的迷你聊天室游戏