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 · 4637 次点击
    这是一个创建于 2616 天前的主题,其中的信息可能已经有所发展或是发生改变。
    因为原创数据是感应器输出的, 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  
       2017-09-29 18:12:11 +08:00 via Android
    我觉得你传感器的输出简直不可思议……你说了半天都没说明白 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   ·   实用小工具   ·   4443 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 01:02 · PVG 09:02 · LAX 17:02 · JFK 20:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.