V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
v2et
V2EX  ›  Python

Python 如何将带有二进制数据的 list 放入 json 载荷?

  •  
  •   v2et · 2019-05-19 16:14:09 +08:00 · 3897 次点击
    这是一个创建于 2013 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在有一个 1400 字节的二进制数据的 list,形式类似[[b']', b'Y', b']', b'Y', b'\'],直接使用 josn.dumps()的话会提示 TypeError: b'' is not JSON serializable,list 不能使用 decode 和 encode,而使用 bytes()和 str()又会破坏原来的字节长度变成 10000 多字节了,而且原本分开的两个字节会黏连成一个 utf-8 字符,请问如何在不改变字节长度的情况下将该 list 放入 json 的载荷呢?

    14 条回复    2019-05-20 23:56:10 +08:00
    registerrr
        1
    registerrr  
       2019-05-19 16:28:16 +08:00
    b 是用来标识 byte 的意思吗? JSON 的 value 存储的类型只有 string,number,object,array,true,false,null 这几种,具体参考 json.org 。并不能直接直接存二进制。两种思路 1.按 number 存,存对应的 ASCII 码; 2.按字符串存
    vitovan
        2
    vitovan  
       2019-05-19 16:43:48 +08:00
    [载荷] 是什么?

    是说怎么把 `[[b']', b'Y', b']', b'Y', b'\']` 这玩意儿转成 JSON 格式吗?
    smdbh
        3
    smdbh  
       2019-05-19 16:47:44 +08:00
    b64 一下啊
    si
        4
    si  
       2019-05-19 17:23:21 +08:00
    一般要保存二进制数据就是存 base64 字符串,缺点就是会长三分之一。
    xpresslink
        5
    xpresslink  
       2019-05-19 22:19:21 +08:00
    楼主问题描述有问题。
    一个 1400 字节的二进制数据的 list,形式类似[[b']', b'Y', b']', b'Y', b'\']
    [[b']', b'Y', b']', b'Y', b'\'] 这个是个 bytes 组成的 list,并不是二进制数据。
    在 pyton 中二进制数据是长成下面这样的。

    [0b1110, 0b10, 0b11, 0b1011101]
    cz5424
        6
    cz5424  
       2019-05-20 00:05:51 +08:00 via iPhone
    存 ASCII 码,输出转换
    v2et
        7
    v2et  
    OP
       2019-05-20 00:10:57 +08:00
    @registerrr 按字符串存会变成 utf 编码,然后有些原来两个相邻的字节就变成一个 utf 字符了。不便于后续处理
    v2et
        8
    v2et  
    OP
       2019-05-20 00:11:47 +08:00
    @vitovan 是的,意思差不多
    v2et
        9
    v2et  
    OP
       2019-05-20 00:12:56 +08:00
    @smdbh
    @si 我试了,列表好像不支持 base64
    v2et
        10
    v2et  
    OP
       2019-05-20 00:15:11 +08:00
    @xpresslink 确实说错了,主要这个原来是示波器读取的二进制波形数据,但是在 python 的函数里变成 bytes 的 list 了,然后固有印象就说错了
    wwwjfy
        11
    wwwjfy  
       2019-05-20 00:30:01 +08:00
    常用做法是 base64
    ''.join() 就是 bytes 了,就可以 base64 了
    Cooky
        12
    Cooky  
       2019-05-20 08:03:54 +08:00 via Android
    自己写一个 JSON 的转换函数,手册里有
    locoz
        13
    locoz  
       2019-05-20 11:47:18 +08:00
    如果一定要直接用 json 存的话,base64 吧,最好是把这个 list 变成整个 bytes 再处理,会方便一些。不过这种其实用 protobuf 之类的会方便很多啊
    Qzier
        14
    Qzier  
       2019-05-20 23:56:10 +08:00
    先合并成一个 bytes,然后在 base64 转成字符串。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2003 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 16:15 · PVG 00:15 · LAX 08:15 · JFK 11:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.