python - 将 Base 64 字符串解码为文件

标签 python file decoding

我正在编写一个从设备接收 Base 64 字符串的程序。该字符串是一个编码的 json 文件,我想这样解释它。

如果我这样做(使用 python base64 库):

decoded = base64.decodestring(base64str) 
print(decoded) 

然后它打印出一堆乱码,因为原始数据不是字符串,而是文件。

我可以在乱码之间看到文件名,所以我猜我正确接收了数据,但需要将其直接解释为文件而不是字符串。

我环顾四周,但没能成功。尝试将字符串保存到文件中显然只会将所有乱码保存到文件中

非常感谢您帮助我完成此操作!

基于 64 的字符串:

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

“解码”字符串:

!A ux o3d3xx.jsonUT   �Ymo�8������P ��'��6RyY�{�ݮ�I m��LӮ��-�̨hp�f� X�[�/uK�G���#A;d����p΅l[r����L��3�3�:���6�s��/�������J�ڠg�/?k� ���7h2�ճ6< ��\���|�`d�9�!�������:v�?siB��/�/�
                                  /��_�����K,�`r�d4����{ J�                                                      � `��#��{4J�    h#�p�$��s ��ԇY��\����o�J�:��6�<wH�xR��{,����           ��,�u��,�?J7W|@� i�哉K�$9����(�W��qZ���-��cu��6s!��P���Y�6G����R�v�-;́B��ĭ�Vܯ7��,��y�,�ψ@1�zH~ ��8~.��'Q��}����6��H���ZV(j7�`����漏t�(������:�S�^��o^t��fl?I��9N�,�G���A�ŷ ��a���\�����Nr���p�]ڍ��� ��R�,��m@��S�D��9����uZ�4�,�r(,�E�֫hCv@C�FIX�:                         ���Z�0�                                                                �z�fI /%��5�                                       �U��o�s�'R�p�yT��h.h8�.&�x��Q/��_���
      �q�_�-�                                                                   -���`F���)F]� ���� ��tXU�*�`M�2�rBd2�DFx��������3�A�h4jf�aKΩ�l3�:�d���+��!�4��z�6�Y8�N����u��$#^���0:q��#LHay�F��%-�I�j^%M��THFc��uW}�;n}nuGc�S�k��O���Y���[��V3�@)5O*��/�9h՛O�vo0
                  ⠞�ߴ�Q�a�~��|R�a�^�<�Ƈ6��+ō�ڠ''�1s�+5��+��     ���                �݀�7p���(����Q�H?<�DA��Q�]EV�I'P����T�>��`j� c       4�A��W>%�ؕ�ޭ7�,7[�                                                     &���u?�LRz�~�q8<�����ԉ.�}� �.Q�Y\H�Tѿ+�K�R �0#��fZ�fv���#W�9��ZM`�KV<���?u�M��iʅGԫ#�!�@��X�1z�|"V1�               ��ivP���. !�C.�!�                                                     g#d��9$UhR�z�Z`� �O�X�����a�ld��}�"�
                 ({UxC��+��+�-构�=> ����g*�8xK���\�xY�3q4$/�ɅZaO�y��R�/2���>�\
=��g��h>0D���P���i�p�@�F���: f�R��'@V�K=a�����M�z[�A�n���b�f���>Oj�A�4��i��r�(D�Gim&�q�(Vi\o]�J���Lש7�xE���t��k�V��J���O�À���L,�&����uJ�qk��MQ/Vn���;��Ye��nF� ��!!��f����_��
                                                                                                                                                      �?7������P�_ A!�_ A ��o3d3xx.jsonUTuxPKFy

希望有一种方法可以提取并保存文件,而无需转换字符串。

最佳答案

当我执行 print(decoded[:20]) 时,我实际上看到的是这样的:

b'PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00!\x00\x00\x00\x00\x00\x00\x00'

PK\x03\x04zip file 的“神奇数字” 。所以就这样对待它。将其保存到名为“mydata.zip”的文件中,然后像解压任何 zip 文件一样解压它,或者在 Python 中处理它,如下所示:

...
decoded = base64.decodestring(base64str) 

import io, zipfile, json, pprint

with zipfile.ZipFile(io.BytesIO(decoded)) as zf:
    for name in zf.namelist():
        print(name)
        with zf.open(name) as f:
            data = json.loads(f.read().decode())

pprint.pprint(data)

根据您的数据,首先打印文件名“o3d3xx.json”,然后打印数据:

{'Applications': [{'Description': '',
                   'ImagerConfiguration': [{'AutoExposureMaxLongShortFactor': 50,
                                            'AutoExposureMinLongShortFactor': 2,


          (... lots and lots and lots of data ...)


             'StaticIPv4SubNetMask': '255.255.255.0',
             'UseDHCP': False}}

关于python - 将 Base 64 字符串解码为文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48467320/

相关文章:

python - HackerRank 上的 SherlockAndAnagrams 算法解释错了吗?

Python:如何下载 zip 文件

python - 如何使用python将文件的内容存储在数组中?

Python 将\r 识别为行分隔符

python - 列表内具有相同名称的列表

c++ - 使用 C++ 读取一行数字

c - 从文件中保存变量?

Android原生级别的视频编解码

android - 在Android中支持对视频文件进行编码/解码

image - 使用 libPng 解码时缩小图像