Tuesday, July 17, 2018

#1 2003-07-05 09:36:08 pm

Nikel
Member
From:: Argentina
Registered: 2003-07-07
Posts: 64

ASCII - Character - Hex - Bin - Dec converter

This program can be used to convert common types of data used when working with computers.  It got a bit big, but the handlers are well separated, so you can set them appart and use them at your own needs. Oh, and the original (as I'm sure you noticed) is in spanish. I tried to explain a few things in english but I got bored, so learn spanish !
It is also full of little fancy things I added, such as the reference table, the default buttons or the Clipboard button.

I don't now if the Mac ASCII table is difernt from others, or if each procesor has a different one, so this might be terribly wrong.
(let me now if it is)

I posted a very simple version of this same program a few weeks ago. You should take a look at the evolution, haha! Amazing!

OS version: OS X

Applescript:

-- para el Hexa - Binario - Decimal

set pedido1 to "Ingrese el valor hexa: " -- "Imput Hex value: "
set pedido2 to "Ingrese el numero binario: " -- "Imput binary numbers: "
set pedido3 to "Ingrese el numero decimal: " -- "Imput decimal number: "
set hexa to {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"}
set binario to {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", ¬
   "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"}
global binario
global hexa

-- para el ASCII - Decimal

set pedido4 to "Ingrese el numero ASCII: " -- "Imput ASCII number: "
set pedido5 to "Ingrese el caracter: " -- "Imput character: "
set aclaracion to "(si escribe más de uno, solo será tomado en cuenta el primero de ellos)" -- if you write more than one, only the first one will be considered"
set Sin_Display to {"NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL", "BS", "HT", ¬
   "LF", "VT", "FF", "CR", "SO", "SI", "DLE", "DC1", "DC2", "DC3", ¬
   "DC4", "NAK", "SYN", "ETB", "CAN", "EM", "SUB", "ESC", "FS", "GS", ¬
   "RS", "US", "Space"}
set exp to {"null", "start of heading", "start of text", "end of text", "end of transmission", ¬
   "enquiry", "acknowledge", "bell", "backspace", "horizontal tabulation", "linefeed", "vertical tabulation", ¬
   "form feed", " carriage return", "shift out", "shift in", "data link escape", "device control 1", ¬
   "device control 2", "device control 3", " device control 4", "negative acknowledge", "synchronous idle", ¬
   "end of transmission block", "cancel", "end of medium", "substitute", "escape", "file separator", ¬
   "group separator", "record separator", "unit separator", "Space"}
-- these are the characters with no on screen display
set nemo to Sin_Display
set nemo to reverse of nemo
set exp to reverse of exp
global Sin_Display
global exp
global nemo

-- los generales para todo el programa

set inicio to "Elija el modo de conversion:" -- "Choose conversion mode:"
set pregunta to "Elija como va a ingresar el dato: " -- "Choose how you want to imput the data: "
set problema to "El valor no es válido para esta conversión." -- "Not valid data for this conversion! "
global problema

repeat
   display dialog inicio buttons {"Salir", "Caracter - ASCII", "Hex - Bin - Dec"} default button 3 -- Salir = Quit
   copy the result as list to {resp}
   try
       if resp is "Caracter - ASCII" then
           display dialog pregunta buttons {"Caracter", "ASCII"} default button 2
           copy the result as list to {respuesta}
           if respuesta is equal to "ASCII" then
               display dialog pedido4 default answer "78" buttons {"OK"} default button 1
               copy the result as list to {ascii}
               set ascii to (ascii * 1) -- elimina los ceros si algun vivo puso muchos delante del numero // Takes care of any ceros the user might have written (useless ceros)
               set a to Predeterminado(ASCII character ascii) -- medio un lio, pero entonces solo tengo una funcion predeterminado
               set caracter to De_ASCII_a_Caracter(ascii) -- rutina que convierte
               set bina to De_Decimal_a_Binario(ascii)
               set bina to Agregar_Ceros(bina)
               set hex to De_Binario_a_Hexa(bina)
               display dialog the "El número ASCII " & ascii & " representa al caracter: " & caracter & return & " Corresponde al hexa: $" & hex ¬
                   & return & " Y al binario: " & bina buttons {"Referencia", "Al portapapeles", "OK"} default button a
               copy the result as list to {boton}
               if boton is equal to "Al portapapeles" then
                   set the clipboard to the "d" & (ascii as string) & " : " & (bina as string) & "b : $" & hex & " : \"" & caracter & "\""
                   set a to the clipboard
                   -- exit repeat
               else if boton is equal to "Referencia" then
                   referencia()
               end if
           else if respuesta is equal to "Caracter" then
               display dialog pedido5 & return & aclaracion default answer "N" buttons {"OK"} -- sin default button porque puede querer saber el ASCII del enter. // no default since "enter"
               copy the result as list to {caracter} -- might be wanted
               set a to Predeterminado(caracter) -- establece si el boton del prox display -- Settles the default button for the next dialog (according to the selected character
               set ascii to De_Caracter_a_ASCII(caracter)
               set bina to De_Decimal_a_Binario(ASCII number caracter)
               set bina to Agregar_Ceros(bina)
               set hex to De_Binario_a_Hexa(bina)
               display dialog the "El caracter " & ascii & " es representado por el número ASCII: " & (ASCII number caracter) & return & " Corresponde al hexa: $" & hex ¬
                   & return & " Y al binario: " & bina buttons {"Referencia", "Al portapapeles", "OK"} default button a
               copy the result as list to {boton}
               if boton is equal to "Al portapapeles" then
                   set the clipboard to the "d" & ((ASCII number caracter) as string) & " : " & (bina as string) & "b : $" & hex & " : \"" & ascii & "\""
                   --exit repeat
               else if boton is equal to "Referencia" then
                   referencia()
               end if
           end if
       else if resp is "Hex - Bin - Dec" then
           display dialog pregunta buttons {"Hexa", "Binario", "Decimal"} default button 3
           copy the result as list to {respuesta}
           if respuesta is "Hexa" then
               display dialog pedido1 default answer "4E" buttons {"OK"} default button 1
               copy the result as list to {hex}
               Chequeo_Hexa(hex)
               set bina to De_Hexa_a_Binario(hex)
               set decimal to De_Binario_a_Decimal(bina)
               try -- si ingresó "FFFF" voy a tener un problema, porque no hay un caracter (me pase de 255) // if user entered "FFFF" i'll have a problem since no Character exists
                   set caracter to De_ASCII_a_Caracter(decimal)
               on error
                   set caracter to "el valor no tiene correspondencia con un caracter." -- "The value does not have any relation to a character
               end try
               display dialog "El hexadecimal $" & hex & " corresponde al binario: " & bina & return & " Al decimal: " & decimal ¬
                   & return & " Y al caracter: " & caracter buttons {"Referencia", "Al portapapeles", "OK"} default button 3
               copy the result as list to {boton}
               if boton is equal to "Al portapapeles" then
                   set the clipboard to the "d" & (decimal as string) & " : " & (bina as string) & "b : $" & hex & " : \"" & caracter & "\""
                   -- exit repeat
               else if boton is equal to "Referencia" then
                   referencia2()
               end if
           else if respuesta is "Binario" then
               set retorno to ""
               display dialog pedido2 default answer "01001110" buttons {"OK"} default button 1
               copy the result as list to {bina}
               Chequeo_Binario(bina)
               set bina to Agregar_Ceros(bina)
               set hex to De_Binario_a_Hexa(bina)
               set decimal to De_Binario_a_Decimal(bina)
               try -- si ingresó "1 1111 1111" voy a tener un problema, porque no hay un caracter (me pase de ocho bits) -- same as above
                   set caracter to De_ASCII_a_Caracter(decimal)
               on error
                   set caracter to "el valor no tiene correspondencia con un caracter." -- same as above
               end try
               display dialog "El binario " & bina & " corresponde al hexa: $" & hex & return & " Al decimal: " & decimal ¬
                   & return & " Y al caracter: " & caracter buttons {"Referencia", "Al portapapeles", "OK"} default button 3
               copy the result as list to {boton}
               if boton is equal to "Al portapapeles" then
                   set the clipboard to the "d" & (decimal as string) & " : " & (bina as string) & "b : $" & hex & " : \"" & caracter & "\""
                   -- exit repeat
               else if boton is "Referencia" then
                   referencia2()
               end if
           else if respuesta is "Decimal" then
               display dialog pedido3 default answer "78" buttons {"OK"} default button 1
               copy the result as list to temp
               set decimal to ((item 1 of temp) * 1) -- solo para cuando lo muestre al final, pero sin eventuales ceros que el usuario pueda haber ingresado. // cuts out ceros user might
               set bina to De_Decimal_a_Binario(decimal)
               set bina to Agregar_Ceros(bina)
               set hex to De_Binario_a_Hexa(bina)
               try -- si ingresó "1024" voy a tener un problema, porque no hay un caracter (me pase de 255) -- same as above
                   set caracter to De_ASCII_a_Caracter(decimal)
               on error
                   set caracter to "el valor no tiene correspondencia con un caracter." -- same as above
               end try
               display dialog "El número " & decimal & " corresponde al binario: " & bina & return & " Al hexa: $" & hex & return ¬
                   & " Y al caracter: " & caracter buttons {"Al portapapeles", "OK"} default button 2
               copy the result as list to {boton}
               if boton is equal to "Al portapapeles" then
                   set the clipboard to the "d" & (decimal as string) & " : " & (bina as string) & "b : $" & hex & " : \"" & caracter & "\""
                   -- exit repeat
               end if
           end if
       else if resp is equal to "Salir" then
           exit repeat
       end if
   on error
       Mensaje_de_Error()
   end try
end repeat

on Mensaje_de_Error()
   beep
   display dialog problema buttons {"OK"} default button 1 with icon 2 giving up after 5
end Mensaje_de_Error

--This shows a list with an explanation of what the mnemonic means (it's in english anyway, you should get it)
on referencia() -- muestra una lista de lo que significa el mnemotécnico entregado en la respuesta ( CR = Carriage Return, por ej)
   set cant to count of nemo
   set menosonce to cant
   set i to 1
   repeat until i = 4
       set disp to ""
       set menosonce to (menosonce - 11)
       repeat until cant = menosonce
           set disp to disp & item cant of nemo & " : " & item cant of exp & return as string
           set cant to cant - 1
       end repeat
       display dialog disp & return & "Pág. " & i & " de 3" buttons {"Nota", "OK"} default button 2
       copy the result as list to {botonete}
       if botonete is equal to "Nota" then display dialog "Esta referencia solo es útil para aquellos " & return & ¬
           "caracteres sin representación gráfica." buttons {"OK"} default button 1 giving up after 5
       set i to (i + 1)
   end repeat
end referencia

--This shows the relation between Hex and binary nybbles (e.g. 1111 = F)
on referencia2() -- muestra las relaciones entre los valores hexadecimales y sus nybbles correspondientes en binario.
   set cant to (count of binario) -- o count of hexa, es igual.
   set i to 1
   set lista to ""
   repeat until i is equal to cant - 7 -- en realidad es cant - 8 + 1
       set lista to lista & return & (item i of hexa) & tab & ":" & tab & (item i of binario) & " " & (item (i + 8) of hexa) & tab & ":" & tab & (item (i + 8) of binario)
       set i to (i + 1)
   end repeat
   display dialog "Relaciones entre valores" & return & "Hexadecimales y Binarios: " & return & lista buttons {"OK"} default button 1
end referencia2

to Predeterminado(valor) -- lo unico que hace es ver cual es el boton que va a poner como predeterminado en el proximo display
   if (ASCII number valor) <= 32 then
       set a to 1
   else
       set a to 3
   end if
   return a
end Predeterminado

to De_ASCII_a_Caracter(valor) -- convierte el numero entregado a su correspondient caracter (y se fija si tiene representación gráfica o no)
   set temp to item 1 of {valor}
   set numero to (item 1 of {valor}) as integer
   if numero <= 32 then
       set temp to item (numero + 1) of Sin_Display
   else if numero = 127 then
       set temp to "DEL"
   else
       set temp to (ASCII character valor)
   end if
   return temp
end De_ASCII_a_Caracter

to De_Caracter_a_ASCII(valor) -- convierte el primer caracter del valor entregado a su correspondiente numero ASCII
   set valor to character 1 of valor
   set temp to (ASCII number valor)
   if temp <= 32 then
       set temp to item (temp + 1) of Sin_Display
   else if temp = 127 then
       set temp to "DEL"
   else
       set temp to valor
   end if
   return temp
end De_Caracter_a_ASCII

on Chequeo_Hexa(numhexa) -- se fija si el valor ingresado por el usuario es un valor hexadecimal valido // Checks if the imputed data is a valid hex value
   set i to 1 --necesito i = 1 porque en algunos pasos uso el caracter i de numhexa, que no puede ser el 0
   repeat until i is equal to ((count of characters of numhexa) + 1) -- i es usado para las letras de numhexa
       set letra to ""
       set j to 1
       repeat until j is equal to ((count of hexa) + 1)
           if (character i of numhexa) is equal to (item j of hexa) then
               set letra to (item j of hexa)
           end if
           set j to (j + 1)
       end repeat
       if letra is equal to "" then
           set t to (4 div 0) -- esto es a proposito, esto da error entonces salgo del try cuando se ingresa algo que no es válido // This is on purpouse, I want to return 'error'
       end if
       set i to (i + 1)
   end repeat
end Chequeo_Hexa

to De_Hexa_a_Binario(numhexa) -- convierte el valor hexadecimal (chequeado) a su correspondiente binario
   set i to 1 --necesito i = 1 porque en algunos pasos uso el caracter i de numhexa, que no puede ser el 0
   set ret to ""
   repeat until i is equal to ((count of characters of numhexa) + 1) -- i es usado para las letras de numhexa
       set j to 1 -- j se usa para los elementos del arreglo hexa
       repeat until j is equal to ((count of hexa) + 1)
           if (character i of numhexa) is equal to (item j of hexa) then
               set ret to ret & "" & (item j of binario)
               exit repeat -- si ya lo encontro no sigo buscando
           end if
           set j to (j + 1)
       end repeat
       set i to (i + 1)
   end repeat
   return ret
end De_Hexa_a_Binario

on Chequeo_Binario(bina) -- se fija si el valor ingresado por el usuario es un valor binario valido (ceros y unos) // Checks if the numbers are 1 and/or 0
   set i to 1 --necesito i = 1 porque en algunos pasos uso el caracter i de numhexa, que no puede ser el 0
   repeat until i is equal to ((count of characters of bina) + 1) -- i es usado para las letras de numhexa
       if (character i of bina) is not equal to "1" then
           if (character i of bina) is not equal to "0" then
               set t to (4 div 0) -- esto es a proposito, esto da error entonces salgo del try cuando se ingresa algo que no es válido // same as above
           end if
       end if
       set i to (i + 1)
   end repeat
end Chequeo_Binario


--This adds ceros to the binary number so that a set of nybbles is formed (max 3 ceros)
to Agregar_Ceros(bina)
   -- esta funcion agrega ceros hasta tener un (multiplo natural de 4) caracteres, para poder comparar con el arreglo Hexa de arriba
   set i to count of (characters of bina)
   -- i es la cantidad de ceros y unos que escribio el chabon
   set y to i - (4 * (i div 4))
   -- y es lo que sobra (max 3 bits) al restarle a i la cantidad natural de nybbles
   set ceros to ""
   if y is not 0 then -- si y distinto de cero
       set i to 0 -- i ahora es un contador
       repeat until i is (4 - y)
           set ceros to "0" & ceros -- agrega tantos ceros como falten
           set i to (i + 1)
       end repeat
   end if
   set bina to ceros & bina
   -- ahora numhexa tiene un numero de caracteres multiplo de 4
   return bina
end Agregar_Ceros

to De_Binario_a_Hexa(bina) -- convierte el valor binario (chequeado) a su correspondiente hexadecimal
   set cant to ((count of (characters of bina)) div 4)
   set i to 1 -- i cuenta la cantidad de nybbles
   set retorno to ""
   repeat until i = cant + 1
       set j to ((4 * i) - 3) -- j lo uso para agrupar de a 4
       -- la formula es para que empiece desde donde debe segun los grupos de nybbles
       set temp to ""
       repeat until j = ((4 * i) + 1)
           set temp to temp & (item j of bina)
           set j to (j + 1)
       end repeat -- termine de agrupar el nybble
       set k to 1
       repeat until k is equal to ((count of binario) + 1)
           if temp is equal to (item k of binario) then
               set retorno to retorno & (item k of hexa)
               exit repeat -- si ya lo encontre paro
           end if
           set k to (k + 1)
       end repeat -- termine de buscar el hexa correspondiente
       set i to (i + 1)
   end repeat -- termine de convertir todo
   return retorno
end De_Binario_a_Hexa

to De_Decimal_a_Binario(decimal)
   set cant to (count of characters of (decimal as string))
   set valor to ""
   set i to 0
   repeat until i is equal to 1
       set valor to (((decimal) - (2 * (decimal div 2))) as string) & valor -- esto da 0 o 1 siempre
       set decimal to (decimal div 2) -- hace la division con resto, siempro 0 o 1
       if decimal is equal to 0 then set i to (i + 1) -- si por alguna razon nunca pasa se pudre todo, porque i no lo incremento ni nada
   end repeat
   return valor
end De_Decimal_a_Binario

to De_Binario_a_Decimal(temp)
   set cant to (count of characters of temp)
   set valor to 0
   set i to cant - 1
   set j to 1
   repeat until i is equal to (-1)
       set valor to valor + ((character j of temp) * (2 ^ i))
       set i to (i - 1)
       set j to (j + 1)
   end repeat
   return valor
end De_Binario_a_Decimal


-- a few tests I did
(*
d65 : 01000001b : $41 : "A"    d11 : 1011b : $B : "VT"    este no se porque no tengo ese boton    estos dos no se pueden porque no tienen sentido (como dice abajo)
d66 : 01000010b : $42 : "B"    d10 : 1010b : $A : "LF"    d127 : 01111111b : $7F : "DEL"    
d67 : 01000011b : $43 : "C"    d9 : 1001b : $9 : "HT"    d127 : 01111111b : $7f : "DEL"    d333 : 000101001101b : $14d : "el valor no tiene correspondencia con un caracter."
d68 : 01000100b : $44 : "D"    d8 : 1000b : $8 : "BS"    d127 : 01111111b : $7F : "DEL"    d333 : 000101001101b : $14D : "el valor no tiene correspondencia con un caracter."
d69 : 01000101b : $45 : "E"    d7 : 0111b : $7 : "BEL"    d127 : 01111111b : $7F : "DEL"    d333 : 000101001101b : $14D : "el valor no tiene correspondencia con un caracter."
*)


America is a Continent, not a country.
Nikel. Argentina, South America.

Offline

 

Board footer

Powered by FluxBB

RSS (new topics) RSS (active topics)