为啥我base64解码出来的字符串会带乱码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥我base64解码出来的字符串会带乱码相关的知识,希望对你有一定的参考价值。
根据《黑客攻防技术宝典》这本书上说,如果从错误的位置开始解码,解码后的字符串中会出现乱码。因此,如果解码后的字符串毫无意义,尝试从4个相邻的偏移位置开始解码。 参考技术A 文字编码前后的字符集一样吗?比如之前是用UTF-8,
现在输出是用默认编码?本回答被提问者采纳
将 Base64 字符串解码为字节数组
【中文标题】将 Base64 字符串解码为字节数组【英文标题】:Decode Base64 string to byte array 【发布时间】:2017-01-05 16:45:55 【问题描述】:我将创建一个 Python 脚本,(或十六进制值数组)。
我的项目的嵌入式方面是一个微控制器,它从原始字节开始创建一个 base64 字符串。该字符串包含一些不可打印的字符(为此我选择 base64 编码)。
在 PC 端,我需要解码 base64 字符串并恢复原始原始字节。
我的脚本使用 python 2.7 和 base64 库:
base64Packet = raw_input('Base64 stream:')
packet = base64.b64decode(base64Packet )
sys.stdout.write("Decoded packet: %s"%packet)
生成的字符串是一个包含一些不可打印字符的字符串。
有没有办法将 base64 字符串解码为字节(或十六进制)值?
提前致谢!
【问题讨论】:
你已经拥有那个字节串了。你期待什么输出,你看到了什么?也许您想在打印时使用%r
?
@MartijnPieters:解码后我会有一个包含每个单字节的 python 列表。
你为什么需要它?你需要操纵字节吗? str
对象已经是一个序列,例如,您可以使用 packet[index]
寻址每个字节,或者使用 for byte in packet:
循环遍历字符串。
您可以仅使用list(packet)
创建列表,生成一个包含 1 个字符(字节)字符串的列表。或者您可能想改用bytearray
对象,但不清楚您想对数据做什么。你还没有给我们你的用例。
那么你想要一个bytearray()
实例;只需使用bytearray(packet)
。字节数组是 0-255 范围内的可变整数序列,每个字节一个整数。
【参考方案1】:
您完全可以使用bytearray。 binascii 模块和 struct 可能也有帮助。
import binascii
import struct
binstr=b"thisisunreadablebytes"
encoded=binascii.b2a_base64(binstr)
print encoded
print binascii.a2b_base64(encoded)
ba=bytearray(binstr)
print list(ba)
print binascii.b2a_hex(binstr)
print struct.unpack("21B",binstr)
【讨论】:
谢谢!您能否提供一个使用 bytearray、binascii 和 struct 来解决我的问题的示例?我不是python高手! 添加示例 - 如果您可以更具体地说明哪些输入应该变成我可以扩展的... 感谢您的示例!我使用以下代码行获取整数值列表:stapacketString = list(bytearray(base64.b64decode(base64Packet)))。这是正确的方法吗?对于我的范围,这是可行的。 看起来是正确的——实际上bytearray
s 的行为类似于list
s(打印除外),所以构造一个list
只需要更漂亮的打印。很高兴我能帮忙:)以上是关于为啥我base64解码出来的字符串会带乱码的主要内容,如果未能解决你的问题,请参考以下文章
Java 中,对Oracle Clob中的图片Base64进行解码后用System.out.println() 输出为啥成乱码,求高手帮忙。