为啥我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)))。这是正确的方法吗?对于我的范围,这是可行的。 看起来是正确的——实际上bytearrays 的行为类似于lists(打印除外),所以构造一个list 只需要更漂亮的打印。很高兴我能帮忙:)

以上是关于为啥我base64解码出来的字符串会带乱码的主要内容,如果未能解决你的问题,请参考以下文章

Java 中,对Oracle Clob中的图片Base64进行解码后用System.out.println() 输出为啥成乱码,求高手帮忙。

BASE64解码之中文乱码问题

java base64解码 怎么是乱码呢

java base64解码 怎么是乱码呢

base64特性导致的不等串解码相同

js原生实现base64编码解码(utf8字符集)