El uso de este código para tomar una cadena de texto y convertirlo a binario:

bin(reduce(lambda x, y: 256*x+y, (ord(c) for c in 'hello'), 0))

esto salidas:

0b110100001100101011011000110110001101111

Que, si lo pongo en este sitio (en la mano derecha del sitio) me llego mi mensaje de hello de la espalda. Me pregunto ¿cuál es el método que utiliza. Sé que podría empalme aparte de la cadena de binario a 8 y luego compararlo con el valor correspondiente a bin(ord(character)) o de alguna otra manera. Buscando algo más simple.

  • Así es su pregunta, «¿hay más de una forma concisa para hacer la inversa de mi código que lo evidente»?
  • relacionados: b2a_bin extensión en Cython permite crear cadenas binarias ("01") directamente desde bytestrings sin la creación de un intermedio de Python entero.
InformationsquelleAutor sbrichards | 2011-09-13

7 Comentarios

  1. 140

    De caracteres ASCII en el rango [ -~] en Python 2:

    >>> import binascii
    >>> bin(int(binascii.hexlify('hello'), 16))
    '0b110100001100101011011000110110001101111'

    A la inversa:

    >>> n = int('0b110100001100101011011000110110001101111', 2)
    >>> binascii.unhexlify('%x' % n)
    'hello'

    En Python 3.2+:

    >>> bin(int.from_bytes('hello'.encode(), 'big'))
    '0b110100001100101011011000110110001101111'

    A la inversa:

    >>> n = int('0b110100001100101011011000110110001101111', 2)
    >>> n.to_bytes((n.bit_length() + 7) // 8, 'big').decode()
    'hello'

    Para apoyar a todos los caracteres Unicode en Python 3:

    def text_to_bits(text, encoding='utf-8', errors='surrogatepass'):
        bits = bin(int.from_bytes(text.encode(encoding, errors), 'big'))[2:]
        return bits.zfill(8 * ((len(bits) + 7) // 8))
    
    def text_from_bits(bits, encoding='utf-8', errors='surrogatepass'):
        n = int(bits, 2)
        return n.to_bytes((n.bit_length() + 7) // 8, 'big').decode(encoding, errors) or '
    def text_to_bits(text, encoding='utf-8', errors='surrogatepass'):
    bits = bin(int.from_bytes(text.encode(encoding, errors), 'big'))[2:]
    return bits.zfill(8 * ((len(bits) + 7) // 8))
    def text_from_bits(bits, encoding='utf-8', errors='surrogatepass'):
    n = int(bits, 2)
    return n.to_bytes((n.bit_length() + 7) // 8, 'big').decode(encoding, errors) or '\0'
    '

    Aquí la única fuente de Python 2/3 versión compatible con:

    import binascii
    
    def text_to_bits(text, encoding='utf-8', errors='surrogatepass'):
        bits = bin(int(binascii.hexlify(text.encode(encoding, errors)), 16))[2:]
        return bits.zfill(8 * ((len(bits) + 7) // 8))
    
    def text_from_bits(bits, encoding='utf-8', errors='surrogatepass'):
        n = int(bits, 2)
        return int2bytes(n).decode(encoding, errors)
    
    def int2bytes(i):
        hex_string = '%x' % i
        n = len(hex_string)
        return binascii.unhexlify(hex_string.zfill(n + (n & 1)))

    Ejemplo

    >>> text_to_bits('hello')
    '0110100001100101011011000110110001101111'
    >>> text_from_bits('110100001100101011011000110110001101111') == u'hello'
    True
    • Esto es exactamente lo que yo necesitaba en realidad, gracias!
    • he probado este método con el de python versión actual y parece que no funciona. <br/> TypeError: ‘str’ no soporta el búfer de la interfaz de <br/> ¿de actualizar tu respuesta
    • Funciona en Python 2. En Python 3 debe convertir a str primero los bytes por ejemplo, your_string.encode('ascii', 'strict')
    • gracias, sin embargo cuando lo probé viceversa el unhexlify función devuelve un mensaje de error: binascii.Error: Impar-longitud de la cadena.
    • escriba '0' si hex-longitud de la cadena no es uniforme. Que pasa si el primer carácter en la cadena original tiene código ascii menos de 16 por ejemplo, '\n' o '\t'. De longitud impar nunca ocurre para ascii de las letras [ -~].
    • no puedo agradecerles lo suficiente.

  2. 14

    Integrado en sólo python

    Aquí es un puro python método para cadenas simples, a la izquierda aquí para la posteridad.

    def string2bits(s=''):
        return [bin(ord(x))[2:].zfill(8) for x in s]
    
    def bits2string(b=None):
        return ''.join([chr(int(x, 2)) for x in b])
    
    s = 'Hello, World!'
    b = string2bits(s)
    s2 = bits2string(b)
    
    print 'String:'
    print s
    
    print '\nList of Bits:'
    for x in b:
        print x
    
    print '\nString:'
    print s2

    String:
    Hello, World!
    
    List of Bits:
    01001000
    01100101
    01101100
    01101100
    01101111
    00101100
    00100000
    01010111
    01101111
    01110010
    01101100
    01100100
    00100001
    
    String:
    Hello, World!
    • chr(int()) es lo que yo estaba buscando!
  3. 9

    No estoy seguro de cómo usted piensa que usted puede hacer otras de carácter por carácter-es intrínsecamente un carácter por carácter de la operación. Sin duda hay código que hay para hacer esto para usted, pero no hay una «simple» manera de hacerlo carácter por carácter.

    Primer lugar, es necesario quitar la 0b prefijo, y a la izquierda de cero de la almohadilla de la cadena de modo que la longitud es divisible por 8, para hacer la división de la bitstring en caracteres de fácil:

    bitstring = bitstring[2:]
    bitstring = -len(bitstring) % 8 * '0' + bitstring

    A continuación, dividir la cadena en bloques de ocho dígitos binarios, los convierten en caracteres ASCII, y unirse a ellos de nuevo en una cadena:

    string_blocks = (bitstring[i:i+8] for i in range(0, len(bitstring), 8))
    string = ''.join(chr(int(char, 2)) for char in string_blocks)

    Si usted realmente quiere tratarlo como un número, usted todavía tiene que tener en cuenta el hecho de que la izquierda personaje estará en la mayoría de los siete dígitos de largo si quieres ir de izquierda a derecha en lugar de a la derecha-a-izquierda.

    • Buena respuesta. Whee!
  4. 2

    Esta es mi manera de resolver su tarea:

    str = "0b110100001100101011011000110110001101111"
    str = "0" + str[2:]
    message = ""
    while str != "":
        i = chr(int(str[:8], 2))
        message = message + i
        str = str[8:]
    print message
    • ¿Por qué usted está agregando ‘0’ en la str = «0» + str[2:] ?. 0b es necesario para eliminar el aquí porque es principio.
  5. 2

    si no y desea importar los archivos puedes usar este:

    with open("Test1.txt", "r") as File1:
    St = (' '.join(format(ord(x), 'b') for x in File1.read()))
    StrList = St.split(" ")

    para convertir un archivo de texto a binario.

    y se puede utilizar para convertir una cadena de caracteres:

    StrOrgList = StrOrgMsg.split(" ")
    
    
    for StrValue in StrOrgList:
        if(StrValue != ""):
            StrMsg += chr(int(str(StrValue),2))
    print(StrMsg)

    la esperanza de que sea útil, la he usado con algunos de cifrado personalizada para enviar a través de TCP.

  6. 1

    Estás buscando el código para hacerlo o la comprensión del algoritmo?

    ¿Esto hacer lo que usted necesita? Específicamente a2b_uu y b2a_uu? Hay un MONTÓN de otras opciones de allí en caso de que esos no son los que usted desea.

    (NOTA: No es un Python chico, pero esto parecía una respuesta obvia)

    • He estado investigando un poco, binascii no está funcionando para mí, y busca sobre todo el código, si lo puedo ver, puedo entenderlo. Gracias EDIT: cuando la conversión de ascii a binario usando binascii a2b_uu para «h» \x00\x00\x00\x00\x00\x00\x00\x00 que no es lo que necesito, necesito ‘hola’ y el real, 1 y 0 no shellcode buscando ascii, también sólo funciona char char
    • que fue muy útil para mis propósitos. Alguien almacena algunos datos en una cadena y la tengo. Estoy bastante seguro de que es un 64binary b/c de la de relleno. Puedo utilizar correctamente b2a_base64 en la que, sin embargo, el resultado es, de hecho, confusa en el mejor. ¿Cómo puedo obtener una lista de boolleans/enteros (0,1) a partir de ahí?
  7. -1

    Este es un arreglaron versión de J. F. Sebastian. Gracias por los fragmentos que a pesar de J. F. Sebastian.

    import binascii, sys
    def goodbye():
        sys.exit("\n"+"*"*43+"\n\nGood Bye! Come use again!\n\n"+"*"*43+"")
    while __name__=='__main__':
        print "[A]scii to Binary, [B]inary to Ascii, or [E]xit:"
        var1=raw_input('>>> ')
        if var1=='a':
            string=raw_input('String to convert:\n>>> ')
            convert=bin(int(binascii.hexlify(string), 16))
            i=2
            truebin=[]
            while i!=len(convert):
                truebin.append(convert[i])
                i=i+1
            convert=''.join(truebin)
            print '\n'+'*'*84+'\n\n'+convert+'\n\n'+'*'*84+'\n'
        if var1=='b':
            binary=raw_input('Binary to convert:\n>>> ')
            n = int(binary, 2)
            done=binascii.unhexlify('%x' % n)
            print '\n'+'*'*84+'\n\n'+done+'\n\n'+'*'*84+'\n'
        if var1=='e':
            aus=raw_input('Are you sure? (y/n)\n>>> ')
            if aus=='y':
                goodbye()

Dejar respuesta

Please enter your comment!
Please enter your name here