请教 Python 二进制转 10 进制 - V2EX
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
ericbize
V2EX    Python

请教 Python 二进制转 10 进制

  •  
  •   ericbize 2017-09-29 12:16:10 +08:00 5026 次点击
    这是一个创建于 3001 天前的主题,其中的信息可能已经有所发展或是发生改变。
    因为原创数据是感应器输出的, 00110101, 这样的东西,然后问题是 用 int ("00110101",2 ) 是可以得到 53 的,但是 用这个转吗方法需要 string 格式,但是 只要 string 就会 把 01 开头的默认为 8 进制。 那么要怎么样才能愉快的转成 10 进制 ?
    32 条回复    2017-10-02 11:28:08 +08:00
    Cooky
        1
    Cooky  
       2017-09-29 12:18:05 +08:00 via Android
    自问自答系列
    ericbize
        2
    ericbize  
    OP
       2017-09-29 12:25:58 +08:00
    @Cooky 没有 ,a = 00110101 , print str(a) 得到的是 36929 , 我不知道怎么解决这个问题
    wwqgtxx
        3
    wwqgtxx  
       2017-09-29 12:32:10 +08:00
    a = 0b00110101
    pright
        4
    pright  
       2017-09-29 13:19:35 +08:00   1
    oct2dec = lambda x: (((x>>21)&0x7)<<7)|(((x>>18)&0x7)<<6)|(((x>>15)&0x7)<<5)|(((x>>12)&0x7)<<4)|(((x>>9)&0x7)<<3)|(((x>>6)&0x7)<<2)|(((x>>3)&0x7)<<1)|(x&0x7)

    a=00110101
    print oct2dec(a)
    ericbize
        5
    ericbize  
    OP
       2017-09-29 13:25:34 +08:00
    @wwqgtxx 在数组加入 0b 的时候已经强行转了~~~
    ericbize
        6
    ericbize  
    OP
       2017-09-29 13:25:48 +08:00
    @pright 谢谢你
    oaix
        7
    oaix  
       2017-09-29 17:10:11 +08:00
    你是不是要实现这个效果
    ```
    >>> int(oct(00110101), 2)
    53
    ```
    oaix
        8
    oaix  
       2017-09-29 17:11:32 +08:00
    感觉你的需求有点搞笑, 最初的那个八进制数字是怎么来的? eval 吗
    ericbize
        9
    ericbize  
    OP
       2017-09-29 17:29:56 +08:00
    @oaix https://akizukidenshi.com/download/ds/aosong/DHT11.pdf 这个是说明, 就是一个 sensor 输出的数据。 其实网上是有其他计算方法的,但是我不想用,毕竟要查重,而且我答应过老师我自己写 code 不回 copy
    ltux
        10
    ltux  
       2017-09-29 17:58:01 +08:00 via Android
    你的传感器输出二进制串 00110101 结果居然不是字符串也不是其二进制结果的整数,而是把这个二进制串按八进制理解得到的整数??? 233333 接口驱动谁写的,去打死他
    ltux
        11
    ltux  
       
    我觉得你传感器的输出简直不可思议……你说了半天都没说明白 python 接收到的到底是啥,是个 01 数组?字符串?整数?
    ltux
        12
    ltux  
       2017-09-29 18:15:48 +08:00 via Android   1
    “这样的东西”是个啥呦……进制转换简直不算个问题,没学过编程的教一遍也能学会,但你得先把接收到的数据格式描述清楚喽
    ltux
        13
    ltux  
       2017-09-29 18:25:55 +08:00 via Android   1
    如果 a 是个整数,a=0o00110101,则 int('%o'%(a),2) 即所求
    如果 a 是个 01 数组,a=[0,0,1,1,0,1,0,1],则 int(''.join(map(str,a)),2) 即所求
    msg7086
        14
    msg7086  
       2017-09-30 02:49:05 +08:00
    你还是先说清楚到底是个什么东西吧。

    数字本来就没有二进制和十进制之分,数字就是数字。只有字符串才是某种进制的表达。不是字符串当然就不需要也不能转换了。
    onlyice
        15
    onlyice  
       2017-09-30 10:21:37 +08:00
    @ericbize 我感觉这种 level 的代码,抄不抄都无所谓的

    比如你要开个平方根,有一些快速开平方根的代码已经实现好了,你难道自己再写一个?

    另外,同样不理解问题是什么。。如果只是 Python 层面的代码,Google 一下 "python convert binary to decimal"
    XIVN1987
        16
    XIVN1987  
       2017-09-30 11:23:17 +08:00 via Android
    感觉传感器发过来的就是字节串吧,,那一串 0 和 1 本来就是一个个 char,所以应该先构造字节串,然后用 int('001101', 2)转成数字,,至于怎么构造字节串:
    s=''
    每来一个字节 ch,执行
    s += chr(ch)
    最后
    i = int(s, 2)
    ericbize
        17
    ericbize  
    OP
       2017-09-30 11:57:59 +08:00
    @ltux 传感器输出的就是高低电压(第四页) 连接看 #9
    ericbize
        18
    ericbize  
    OP
       2017-09-30 11:58:38 +08:00
    @msg7086 emmmm 我自己都乱了,表达不好
    ericbize
        19
    ericbize  
    OP
       2017-09-30 11:59:07 +08:00
    @onlyice 关键是有 turnitin 查重啊~~~
    ericbize
        20
    ericbize  
    OP
       2017-09-30 11:59:58 +08:00
    @XIVN1987 #17 楼 , 其实输出的是高低电压
    XIVN1987
        21
    XIVN1987  
       2017-09-30 12:29:34 +08:00
    @ericbize
    那也可以用我说的那种办法

    s = ''
    for i in range(LEN):
    if SENSOR_PIN_LEVEL == 1: s += '1'
    else: s += '0'
    i = int(s, 2)
    XIVN1987
        22
    XIVN1987  
       2017-09-30 12:32:51 +08:00

    s = ''
    for i in range(LEN):
    if SENSOR_PIN_LEVEL == 1: s += '1'
    else: s += '0'
    i = int(s, 2)
    XIVN1987
        23
    XIVN1987  
       2017-09-30 12:34:23 +08:00
    python
    s = ''
    for i in range(LEN):
    if SENSOR_PIN_LEVEL == 1: s += '1'
    else: s += '0'
    i = int(s, 2)
    XIVN1987
        24
    XIVN1987  
       2017-09-30 12:35:39 +08:00
    v2ex 怎么贴代码才能保留空格缩进啊???
    msg7086
        25
    msg7086  
       2017-09-30 13:26:51 +08:00
    @XIVN1987 gist。

    @ericbize 如果输出的是二进制的话,我猜你需要用 unpack 家族。
    xierch
        26
    xierch  
       2017-09-30 20:58:24 +08:00
    你要直接判断高低电压,一个 bit 一个 bit 地读么…
    那你就读到 1 的时候,加一然后向左移一位( n += 1, n << 1 );
    读到 0 的时候,直接向左移一位( n << 1 )…
    ericbize
        27
    ericbize  
    OP
       2017-10-01 15:26:21 +08:00
    @xierch 对啊,一 bit 一 bit 得读出来,然后写入 array 里面,最后计算。
    ericbize
        28
    ericbize  
    OP
       2017-10-01 15:27:18 +08:00
    @XIVN1987 你的头像想表达什么 ?
    ericbize
        29
    ericbize  
    OP
       2017-10-01 15:28:24 +08:00
    @msg7086 #13 楼的就可以了~~~
    XIVN1987
        30
    XIVN1987  
       2017-10-01 18:43:57 +08:00 via Android
    @ericbize
    这不就是 ipython 的图标吗,,表示喜欢 ipython
    xierch
        31
    xierch  
       2017-10-02 09:27:48 +08:00
    @ericbize 所以你直接用一个 int 来存就好了嘛… 边读变转这样…
    #13 的还是先转 str 的嘛(
    ericbize
        32
    ericbize  
    OP
       2017-10-02 11:28:08 +08:00
    @xierch 对啊 13 楼的还是先转 str 但是不知道为什么能得到正确结果哎 。

    其实寿面还要校验 , 而且我不知道 >> << | 这些怎么用 。 还没学会 ()
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5212 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 08:30 PVG 16:30 LAX 00:30 JFK 03:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86