Program pro převádění binárního kódu na znaky (ASCII) – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Program pro převádění binárního kódu na znaky (ASCII) – Python – Fórum – Programujte.comProgram pro převádění binárního kódu na znaky (ASCII) – Python – Fórum – Programujte.com

 

vojtano_k0
Návštěvník
26. 10. 2006   #1
-
0
-

Zdravím.
Takže převádění znaků na binární kód už sem vyřešil (minulé téma), ale zasekl jsem se u jiné věci: převádění binárního kódu na znaky. Vím jak na to (viz. skript), ale zatím umím převádět jenom jeden byte. Jako že musím zadat osm jedniček nebo nul a to mi vyhodnotí jako jeden znak. potřeboval bych ale, aby ten program uměl i několik bytů najednou (abych nemusel zadávat jednotlivé byty). Třeba že bych do vstupního pole zadal: 01000001 01001001 01001111 01001010 a vyhodnotilo by mi to jako AHOJ. Má někdo nějaké nápady? Napadlo mě nějak ten řetězec "rozsekat", ale nevím jak na to. V Pythonu nejsem ještě tak zkušený... (asi m?s?c)
Skript:



# -*- coding: cp1250 -*-
#autor: vojtech

#import
from Tkinter import *

#definovani funkci:

def vynulovat_fce():
vstup.delete(0,"end")
vystup.delete(0,"end")

def asciitobin_fce():
vystup.delete(0, "end")
bin_veta=""
veta=vstup.get()
for znak in veta:
znak=ord(znak)
hex_znak=hex(znak)
if hex_znak[-2]=="0": bin_veta=bin_veta+" 0000"
if hex_znak[-2]=="1": bin_veta=bin_veta+" 0001"
if hex_znak[-2]=="2": bin_veta=bin_veta+" 0010"
if hex_znak[-2]=="3": bin_veta=bin_veta+" 0011"
if hex_znak[-2]=="4": bin_veta=bin_veta+" 0100"
if hex_znak[-2]=="5": bin_veta=bin_veta+" 0101"
if hex_znak[-2]=="6": bin_veta=bin_veta+" 0110"
if hex_znak[-2]=="7": bin_veta=bin_veta+" 0111"
if hex_znak[-2]=="8": bin_veta=bin_veta+" 1001"
if hex_znak[-2]=="9": bin_veta=bin_veta+" 1001"
if hex_znak[-2]=="a": bin_veta=bin_veta+" 1010"
if hex_znak[-2]=="b": bin_veta=bin_veta+" 1011"
if hex_znak[-2]=="c": bin_veta=bin_veta+" 1100"
if hex_znak[-2]=="d": bin_veta=bin_veta+" 1101"
if hex_znak[-2]=="e": bin_veta=bin_veta+" 1110"
if hex_znak[-2]=="f": bin_veta=bin_veta+" 1111"
if hex_znak[-1]=="0": bin_veta=bin_veta+"0000"
if hex_znak[-1]=="1": bin_veta=bin_veta+"0001"
if hex_znak[-1]=="2": bin_veta=bin_veta+"0010"
if hex_znak[-1]=="3": bin_veta=bin_veta+"0011"
if hex_znak[-1]=="4": bin_veta=bin_veta+"0100"
if hex_znak[-1]=="5": bin_veta=bin_veta+"0101"
if hex_znak[-1]=="6": bin_veta=bin_veta+"0110"
if hex_znak[-1]=="7": bin_veta=bin_veta+"0111"
if hex_znak[-1]=="8": bin_veta=bin_veta+"1001"
if hex_znak[-1]=="9": bin_veta=bin_veta+"1001"
if hex_znak[-1]=="a": bin_veta=bin_veta+"1010"
if hex_znak[-1]=="b": bin_veta=bin_veta+"1011"
if hex_znak[-1]=="c": bin_veta=bin_veta+"1100"
if hex_znak[-1]=="d": bin_veta=bin_veta+"1101"
if hex_znak[-1]=="e": bin_veta=bin_veta+"1110"
if hex_znak[-1]=="f": bin_veta=bin_veta+"1111"
vystup.insert(0, bin_veta)

def bintoascii_fce():
znak=vstup.get()
dec_veta=0
if znak[-1] == "1":
dec_veta=dec_veta+1
if znak[-2] == "1":
dec_veta=dec_veta+2
if znak[-3]== "1":
dec_veta=dec_veta+4
if znak[-4] == "1":
dec_veta=dec_veta+8
if znak[-5] == "1":
dec_veta=dec_veta+16
if znak[-6] == "1":
dec_veta=dec_veta+32
if znak[-7] == "1":
dec_veta=dec_veta+64
if znak[-8] == "1":
dec_veta=dec_veta+128
print dec_veta
dec_veta=chr(dec_veta)
vystup.insert(0,dec_veta)
print dec_veta

def napoveda_fce():
nap=Toplevel()
nap.title('Napoveda')
nap.transient(hlavni_okno)
nap.focus_set() # aby bylo okno aktivn?
Label(nap,text='Napoveda k programu abc_to_bin_and_back', font=("Arial", '14')).pack()
Label(nap, text=__doc__, font=("Arial")).pack()
textN="""Do vstupniho pole zadejte pozadovany vyraz pro prelozeni
(retezec znaku pro prevod do dvojkoveho kodu).
Byty zadavejte samostatne jeden po druhem (zadejte napr. 01000001,
vyhodnotte, vynulujte, zadejte 01011000, vyhodnotte...)
Vysledek se vam zobrazi ve vystupnim poli, odkud ho muzete pres schranku
zkopirovat a pouzit.

Tento program je siren pod licenci GNU/GPL, ve zdrojovem adresari najdete
ve slozce "source" zdrojovy kod ve formatu *.py i *.txt
"""
Label(nap,text=textN, font=("Arial")).pack()
Button(nap, text='OK', command= nap.destroy).pack(ipadx=100, padx=5,pady=5)
nap.mainloop()

#viditelna cast:

#hlavni okno:

hlavni_okno=Tk()
hlavni_okno.title("Prekladac Bin <=> ASCII")

#ramecky:

ramecek1=Frame(hlavni_okno)
ramecek1.pack()

ramecek2=Frame(hlavni_okno)
ramecek2.pack()

ramecek3=Frame(hlavni_okno)
ramecek3.pack()

ramecek4=Frame(hlavni_okno)
ramecek4.pack()

#widgety:

vstup1=Label(ramecek1, text="Zad?n?: ")
vstup1.pack(side=LEFT,padx=5,pady=5)

vstup=Entry(ramecek1, width=45)
vstup.pack(padx=5,pady=5)


asciitobin=Button(ramecek2, text=" ASCII => BIN ", command=asciitobin_fce)
asciitobin.pack(side=LEFT,padx=5,pady=5)

bintoascii=Button(ramecek2, text=" BIN => ASCII ", command=bintoascii_fce)
bintoascii.pack(side=LEFT, padx=5, pady=5)

vystup1=Label(ramecek3, text="V?sledek: ")
vystup1.pack(side=LEFT,padx=5,pady=5)

vystup=Entry(ramecek3, width=45)
vystup.pack(padx=5,pady=5)

vynulovat=Button(ramecek4, text=" Vynulovat ", command=vynulovat_fce)
vynulovat.pack(side=LEFT, padx=5,pady=5)

napoveda=Button(ramecek4, text=" Napoveda ", command=napoveda_fce)
napoveda.pack(padx=5, pady=5)

#smycka:

hlavni_okno.mainloop()


Jinak kdyby měl někdo nápad na zlepšení/zjednodušení/"upgrade", tak mu budu jen vděčný. Díky moc předem.

Nahlásit jako SPAM
IP: ...–
"Jen dvě věci jsou nekonečné. Vesmr a lidská hloupost. Ale tím prvním si nejsem jistý." - Einstein
geon0
Grafoman
26. 10. 2006   #2
-
0
-

Mnoho if naznačuje, že není použito nejlepšího řešení.

Já jsem se na průmyslovce učil jeden takovej algoritmus na převod čísel do binárního tvaru. Číslo vzít, vydělit dvěma, zbytek pamatovat. Pak vzít výsledek po dělení, znovu ho vydělit dvěmi, zbytek připojit zprava k minulému zbytku. A dělat to tak dlouho, než výsledek bude nula.

Funkce na nápovědu mi silně připomíná nápovědu z mojí kalkulačky.

Nahlásit jako SPAM
IP: ...–
geon. volume doprava.
geon0
Grafoman
26. 10. 2006   #3
-
0
-

A na druhou stranu, tak to snad se dá taky jednoduchým algoritmem, a ne těmi tisíci ify, vždyť je to hrůza ;-).

Nahlásit jako SPAM
IP: ...–
geon. volume doprava.
vojtano_k0
Návštěvník
26. 10. 2006   #4
-
0
-

Jak ??k?m, v Pythonu toho zat?m moc neum?m. Nemohl bys m? trochu uv?st do toho, jak ud?lat ten algorytmus? vůbec toti? nevím o co jde. A k t? n?pov?d? - m?? pravdu. Je to z tvoj? kalkula?ky :-), ale byla ???ena pod GPL, tak sem si myslel, ?e bych to mohl pou??t... Jestli ti to vad?, ?ekni, m??u to smazat a ud?lat jinak. Jenom sem v danou chv?li nev?d?l jak to ud?lat. A ktomu p?ev?d?n? z bin?rn? soustavy na znaky (p?ekl?d?n? v?ce byt? najednou), nem?? n?jakou my?lenku ?i n?vrh?

Nahlásit jako SPAM
IP: ...–
"Jen dvě věci jsou nekonečné. Vesmr a lidská hloupost. Ale tím prvním si nejsem jistý." - Einstein
geon0
Grafoman
26. 10. 2006   #5
-
0
-

To použití funkce je v pohodě, je to GPL, takže no problem.
K tomu rozsekání řetězce na části, na slova, to bylo tuším v třetí lekci. Metoda split().

Nahlásit jako SPAM
IP: ...–
geon. volume doprava.
vojtano_k0
Návštěvník
28. 10. 2006   #6
-
0
-

Diky, kuknu na to. Promiň, že s tím furt otravuju, ale nemáš nějaký nápad na ten algoritmus? Mě napadlo zatím tohle:



veta = raw_input("Zadej neco: ")
bin_veta=""
obracena_veta=""
for znak in veta:
znak=ord(znak)
for i in range(8):
bin_veta=bin_veta+str(znak%2)
znak=znak/2
for cislo in bin_veta:
obracena_veta=cislo+obracena_veta
print obracena_veta


Moc mi to ale nefunguje. U jednoho písmenka jo (jako že zadáš jeden znak a vyhodnotíš), ale u více mi to blbne. Podíval by ses na to, prosím?

Nahlásit jako SPAM
IP: ...–
"Jen dvě věci jsou nekonečné. Vesmr a lidská hloupost. Ale tím prvním si nejsem jistý." - Einstein
vojtano_k0
Návštěvník
28. 10. 2006   #7
-
0
-

Tak p?ev?d?n? v?ce byt? na znaky u? je v pohod? (viz. dole). Po??d ale nem??u p?ij?t na ten algoritmus pro p?ev?d?n? znak? na bin?rn? k?d. Tady je skript, zat?m pro p?evod znak? do bin pou??v? IFy, ale to by se mohlo v nejbli??? dob? zm?nit...



# -*- coding: cp1250 -*- ; autor: vojtech
import os
while 1:
os.system("cls")
rozhodnuti=input("Pro prekladani znaku do binarni podoby, stisknete 0. nPro prekladani binarniho kodu na znaky, stisknete 1. : ")
if rozhodnuti == 0:
veta=raw_input("Zadej vetu ci slovo pro prelozeni: ")
bin_veta="";hex_veta="";dec_veta=""
for pismeno in veta:
ord_pismeno=ord(pismeno)
hex_pismeno=hex(ord_pismeno)
hex_pismeno=hex_pismeno[2:4]
hex_veta=hex_veta+hex_pismeno+" "
for znak in veta:
znak=ord(znak)
dec_veta=dec_veta+str(znak)+" "
hex_znak=hex(znak)
if hex_znak[-2]=="0": bin_veta=bin_veta+" 0000"
if hex_znak[-2]=="1": bin_veta=bin_veta+" 0001"
if hex_znak[-2]=="2": bin_veta=bin_veta+" 0010"
if hex_znak[-2]=="3": bin_veta=bin_veta+" 0011"
if hex_znak[-2]=="4": bin_veta=bin_veta+" 0100"
if hex_znak[-2]=="5": bin_veta=bin_veta+" 0101"
if hex_znak[-2]=="6": bin_veta=bin_veta+" 0110"
if hex_znak[-2]=="7": bin_veta=bin_veta+" 0111"
if hex_znak[-2]=="8": bin_veta=bin_veta+" 1001"
if hex_znak[-2]=="9": bin_veta=bin_veta+" 1001"
if hex_znak[-2]=="a": bin_veta=bin_veta+" 1010"
if hex_znak[-2]=="b": bin_veta=bin_veta+" 1011"
if hex_znak[-2]=="c": bin_veta=bin_veta+" 1100"
if hex_znak[-2]=="d": bin_veta=bin_veta+" 1101"
if hex_znak[-2]=="e": bin_veta=bin_veta+" 1110"
if hex_znak[-2]=="f": bin_veta=bin_veta+" 1111"
if hex_znak[-1]=="0": bin_veta=bin_veta+"0000"
if hex_znak[-1]=="1": bin_veta=bin_veta+"0001"
if hex_znak[-1]=="2": bin_veta=bin_veta+"0010"
if hex_znak[-1]=="3": bin_veta=bin_veta+"0011"
if hex_znak[-1]=="4": bin_veta=bin_veta+"0100"
if hex_znak[-1]=="5": bin_veta=bin_veta+"0101"
if hex_znak[-1]=="6": bin_veta=bin_veta+"0110"
if hex_znak[-1]=="7": bin_veta=bin_veta+"0111"
if hex_znak[-1]=="8": bin_veta=bin_veta+"1001"
if hex_znak[-1]=="9": bin_veta=bin_veta+"1001"
if hex_znak[-1]=="a": bin_veta=bin_veta+"1010"
if hex_znak[-1]=="b": bin_veta=bin_veta+"1011"
if hex_znak[-1]=="c": bin_veta=bin_veta+"1100"
if hex_znak[-1]=="d": bin_veta=bin_veta+"1101"
if hex_znak[-1]=="e": bin_veta=bin_veta+"1110"
if hex_znak[-1]=="f": bin_veta=bin_veta+"1111"
print "";print "Zapis v dekadicke soustave: ",dec_veta,"n"
print "Zapis v hexa-decimalni soustave: ",hex_veta,"n"
print "Zapis v binarni soustave: ",bin_veta,"n"

if rozhodnuti == 1:
print ""
print "Byty pro prelozeni zadavejte stejne jako znaky - tj. jako posloupnost"
print "8 bitu, mezera, osm bitu, mezera...n"
veta=raw_input("Zadej byty(e) pro prelozeni: ")
veta2=veta.split()
vy_veta=""
for znak in veta2:
ascii_veta=0
if znak[-1] == "1":
ascii_veta=ascii_veta+1
if znak[-2] == "1":
ascii_veta=ascii_veta+2
if znak[-3]== "1":
ascii_veta=ascii_veta+4
if znak[-4] == "1":
ascii_veta=ascii_veta+8
if znak[-5] == "1":
ascii_veta=ascii_veta+16
if znak[-6] == "1":
ascii_veta=ascii_veta+32
if znak[-7] == "1":
ascii_veta=ascii_veta+64
if znak[-8] == "1":
ascii_veta=ascii_veta+128
ascii_veta=chr(ascii_veta)
vy_veta=vy_veta+ascii_veta
print "nZnak prevedeny z dvojkove soustavy: ",vy_veta
print "nPro pokracovani stisknete Enter..."
x=raw_input()

Nahlásit jako SPAM
IP: ...–
"Jen dvě věci jsou nekonečné. Vesmr a lidská hloupost. Ale tím prvním si nejsem jistý." - Einstein
geon0
Grafoman
28. 10. 2006   #8
-
0
-

Převod čísla do binárního tvaru:

Číslo vzít, vydělit dvěma, zbytek zapamatovat. Pak vzít výsledek po dělení, znovu ho vydělit dvěmi, zbytek připojit zleva k minulýmu zbytku. A dělat to tak dlouho, než výsledek bude nula.

Nahlásit jako SPAM
IP: ...–
geon. volume doprava.
vojtano_k0
Návštěvník
28. 10. 2006   #9
-
0
-

m? to ale h??ek (to tvoje vysv?tlen?). Kdy? si nap??klad vezme? ??slo 12 a 254. M?? r?zn? po?et zbytk?. Tud?? bych ?ekl, ?e to bude? d?lit osmkr?t, zbytky dycky poka?d?m d?len? zapamatuje? a na konci to p?evr?t??. Stejn? to m?m ud?lan? v tom skriptu o mysl?m t?i p??sp?vky zp?t, ale nefunguje mi to. Tak nev?m.

Nahlásit jako SPAM
IP: ...–
"Jen dvě věci jsou nekonečné. Vesmr a lidská hloupost. Ale tím prvním si nejsem jistý." - Einstein
geon0
Grafoman
29. 10. 2006   #10
-
0
-

Když posunuješ inicializaci bin_veta="" a obracena_veta="" dovnitř cyklu, kam správně patří, a tisk obracene_vety taky, tak vše funguje jak má.

Pokud zadáváš 12, tak ve skutečnosti zadáváš "12", kde ord("1")=49 a ord ("2")=50.
Takže ti logicky vyjde:

Zadej neco: 12

00110001 00110010


A co takhle použít:
        bin_veta=str(znak%2)+bin_veta


;-)

Nahlásit jako SPAM
IP: ...–
geon. volume doprava.
vojtano_k0
Návštěvník
29. 10. 2006   #11
-
0
-

No, t?m se to v?echno vysv?tluje. Ka?dop?dn? moc d?ky za pomoc. Zase sem bl?? k tomu, b?t "dobr?" program?tor. Ale stejn? se toho mus?m je?t? hooodn? u?it. Mus?m nau?it p?em??let jak ty - program?torsky :-) Na leto?n?m INVEXu jsem si koupil Uplnou referen?n? p??ru?ku jazyka Python. Tak ji te?ka studuju... zaj?mav? po?ten?. Dobr? na dlouh? zimn? ve?ery, kdy? neum?m usnout :D. Tak teda moc d?ky za vysv?tlen? a hodn? zdaru Pythonu! :-)

Nahlásit jako SPAM
IP: ...–
"Jen dvě věci jsou nekonečné. Vesmr a lidská hloupost. Ale tím prvním si nejsem jistý." - Einstein
geon0
Grafoman
29. 10. 2006   #12
-
0
-

No a ten převod zpět - nevím jestli znáš pojem mocniny - například "dvě na druhou" == 2**2. Jestli ano tak binární na dekadický zápis se převádí tak, že každou pozici násobíš dvojkou umocněnou na číslo pozice.

101= 1*2**2 + 0*2**1 + 1*2**0 = 5

Je to ale lepší dělat odzadu.


;-)

Nahlásit jako SPAM
IP: ...–
geon. volume doprava.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 14 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý