numero hexadecimal convertir como codigo binario python binary ascii

python - hexadecimal - Convierte binario a ASCII y viceversa



convertir un numero a binario en python (7)

Usando este código para tomar una cadena y convertirla a binario:

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

esta salidas:

0b110100001100101011011000110110001101111

Lo cual, si lo coloco en este sitio (en el lado derecho), recibo mi mensaje de hello . Me pregunto qué método usa. Sé que podría separar la cadena de caracteres binarios en 8 y luego hacer coincidir el valor correspondiente con bin(ord(character)) o de alguna otra manera. Realmente buscando algo más simple.


Built-in only python

Aquí hay un método de python puro para cadenas simples, que queda 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!


¿Estás buscando el código para hacerlo o entender el algoritmo?

¿Esto hace lo que necesitas ? Específicamente a2b_uu y b2a_uu ? Hay MUCHAS otras opciones allí en caso de que no sean lo que quieres.

(NOTA: No es un tipo de Python, pero esta parecía ser una respuesta obvia)


Esta es mi manera de resolver tu tarea:

str = "0b110100001100101011011000110110001101111" str = "0" + str[2:] message = "" while str != "": i = chr(int(str[:8], 2)) message = message + i str = str[8:] print message


Esta es una versión arreglada de JF Sebastian''s. Gracias por los fragmentos, aunque JF 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()


No estoy seguro de cómo crees que puedes hacerlo más que carácter por carácter: es inherentemente una operación de carácter por personaje. Ciertamente hay un código para hacer esto por usted, pero no hay una manera "más simple" de hacerlo personaje por personaje.

En primer lugar, debe quitar el prefijo 0b , y dejar el cero a la altura de la cadena para que su longitud sea divisible entre 8, para facilitar la división de la cadena de bits en caracteres:

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

Luego divide la secuencia en bloques de ocho dígitos binarios, conviértalos en caracteres ASCII y vuélvalos a unir:

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 realmente desea tratarlo como un número, aún debe tener en cuenta el hecho de que el personaje situado más a la izquierda tendrá como máximo siete dígitos si desea ir de izquierda a derecha en lugar de derecha a izquierda.


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

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

En reversa:

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

En Python 3.2+:

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

En reversa:

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

Para admitir 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 ''/0''

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

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


si no quieres importar ningún archivo, puedes usar esto:

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 puede usar esto para convertirlo de nuevo a cadena:

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

Espero que sea útil, lo he usado con un cifrado personalizado para enviar a través de TCP.