【问题标题】:Recursively convert Ascii to binary in python在python中递归地将Ascii转换为二进制
【发布时间】:2013-12-13 00:58:00
【问题描述】:

我一直在做一个 Python 项目,我正在尝试使用原始 ASCII 代码,并将其合并到密码中。但在此之前,我想知道是否有一种方法可以将 ascii 递归转换为二进制。 Python 2.7.5 顺便说一句。 这是我的代码:

inputMessage= raw_input("Enter message for conversion: ")
        print "Decoded string: "
        #text to ascii
        for ch in inputMessage:
            print ord(ch)
        print "\n\n"
        #ascii to binary
        print "ASCII to Binary:"
        print bin(ord(ch))
        print
        print "The Binary without the '0b':"
        for ch in inputMessage:
            print bin(ord(ch))[2::]

我在 shell 中的输出:

Enter message for conversion: Hi, my name is Johnny
Decoded string: 
72
105
44
32
109
121
32
110
97
109
101
32
105
115
32
74
111
104
110
110
121

ASCII to Binary:
0b1001000
0b1101001
0b101100
0b100000
0b1101101
0b1111001
0b100000
0b1101110
0b1100001
0b1101101
0b1100101
0b100000
0b1101001
0b1110011
0b100000
0b1001010
0b1101111
0b1101000
0b1101110
0b1101110
0b1111001

我需要知道的是如何在转换为二进制时递归遍历 number 的 ascii 输出的每个数字。谁有解决办法?

【问题讨论】:

标签: python windows python-2.7


【解决方案1】:
def toBin(n):
    return toBin(n/2) + str(n%2) if n else ""

>>> toBin(ord('A'))
'1000001'

>>> Message= raw_input("Enter message for conversion: ")
Enter message for conversion: Hey now!

>>> ''.join(toBin(ord(c)) for c in Message)
'100100011001011111001100000110111011011111110111100001'

如果您需要它为 n=0 工作,请使用它

def toBin(n, z=1):
    return toBin(n/2, 0) + str(n%2) if n else str(n)*z

如果您需要填充到 8 位,您可以这样做:

def toBin(n, z=8):
   return toBin(n/2, z-1) + str(n%2) if n else str(n)*z

>>> toBin(10)
'00001010'
>>> toBin(ord("A"))
'01000001'

【讨论】:

  • 问题是这将返回 '' 的合法值 toBin(0) 如果你将 return toBin(n/2) + str(n%2) if n else "" 更改为 return toBin(n/2) + str(n%2) if n else "0" 然后你修复它但在所有 bin 值上得到一个前导 0 .嗯。
  • 0 不是问题所需的 ascii 值。
【解决方案2】:
>>> my_string = 'myname is james'
>>> my_binary = [bin(ord(i)) for i in js]
>>> my_binary
['0b1101101', '0b1111001', '0b1101110', '0b1100001', '0b1101101', '0b1100101', '0b100000', '0b1101001', '0b1110011', '0b100000', '0b1101010', '0b1100001', '0b1101101', '0b1100101', '0b1110011']
>>> bin = ''.join(jb)
>>> bin
'0b11011010b11110010b11011100b11000010b11011010b11001010b1000000b11010010b11100110b1000000b11010100b11000010b11011010b11001010b1110011'

【讨论】:

  • 谢谢。现在这是有道理的,因为我可以看到这个过程。 :D
  • 您需要删除0b 前缀并在必要时用零填充(一个字节 - 8 位)。
【解决方案3】:

这是一个以 10 为底的十进制数字到二进制数字列表的递归转换:

def binary(n):
   if n < 2:
       return [n]
   else:
       return binary(n / 2) + [n % 2]

像这样使用它:

>>> tgt='33'
>>> print ''.join(map(str, binary(int(tgt))))
100001

如果你想直接返回字符串(绕过列表和字符串的转换)你可以使用这个函数:

def d2bin(n):
    s=str(n%2)
    if n>>1 > 0:
        s+=d2bin(n>>1)
    return s

这样使用:

>>> d2bin(0)
'0'
>>> d2bin(65)
'1000001'

【讨论】:

  • 看来 OP 想要:'ab' -> 0110000101100010 即'33' -> 0011001100110011
猜你喜欢
  • 2021-02-16
  • 2016-10-02
  • 2011-05-12
  • 2014-08-16
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2021-01-07
  • 2018-08-28
相关资源
最近更新 更多