我已经构建了两个解析器,这些解析器可用于除某些二进制块以外的所有内容。一个从专有格式转换为标准json,另一个从json转换回专有格式。
当我写一个去json的代码时,我很高兴能将其全部解析为有效的json,但担心我可能无法将二进制节重新带回去,而且这种担忧似乎已经实现。
我认为base64是必要的或一种可能的解决方案,因为二进制文件否则会充满json不喜欢的字符,我认为尝试转义它们等比该base64解决方案更具挑战性。
这是原始文件中的一个二进制块:
cleanbinary = "0\x82\x02\xd80\x82\x01\xc0\xa0"
它像这样被带入base64:
import base64
out = base64.encodebytes(cleanbinary.encode('utf-8'))
print(out)
>> b'MMKCAsOYMMKCAcOAwqA=\n'
那样,您可以将其转换为二进制文件:
z = base64.decodebytes(out).decode('utf-8')
print(z == cleanbinary)
>> True
它需要中间的一步,但是我无法解决在循环中间将其放入json的问题。尝试了以下方法:
wrapped = '"' + str(out) + '"'
所以现在您有了json需要的双引号,它是str
而不是bytes
:
print(wrapped)
>> '"b\'MMKCAsOYMMKCAcOAwqA=\\n\'"'
现在可以说您已经使用Python的json解析器从json文件中提取了此字符串值。如何将其转换为字节值:
b'MMKCAsOYMMKCAcOAwqA=\n'
..以便可以将其解析回二进制文件?
答案 0 :(得分:2)
我建议将您的字节转换为字符串,然后通过显式解码和编码将其返回:
out = b'MMKCAsOYMMKCAcOAwqA='
wrapped = f'"{out.decode()}"'
print(wrapped) # ---> "MMKCAsOYMMKCAcOAwqA="
unwrapped = wrapped.strip('"').encode()
print(unwrapped) # ---> b'MMKCAsOYMMKCAcOAwqA='