1 votos

Cómo hacer que mi traductor binario procese varios números binarios

Actualmente estoy construyendo un traductor de binarios (binario a texto) en el editor de AppleScript. El código que escribí sólo permite introducir un número binario a la vez. Quiero introducir varios números binarios a la vez y que el código los traduzca. He estado pensando en muchas formas diferentes de hacer que el código traduzca múltiples números (binarios), pero todo lo que intento no parece funcionar. Soy relativamente nuevo en AppleScript, y estoy bastante perplejo. Aquí está el código:

set binaryString to text returned of (display dialog "Binary Goes Here:" default answer "" with icon note buttons {"Cancel", "Translator"} default button 2 with title "Binary Translator") as string
set n8 to character 1 of binaryString
set n7 to character 2 of binaryString
set n6 to character 3 of binaryString
set n5 to character 4 of binaryString
set n4 to character 5 of binaryString
set n3 to character 6 of binaryString
set n2 to character 7 of binaryString
set n1 to character 8 of binaryString
if n8 = "0" then
    set d8 to 0
else if n8 = "1" then
    set d8 to 128
end if
if n7 = "0" then
    set d7 to 0
else if n7 = "1" then
    set d7 to 64
end if
if n6 = "0" then
    set d6 to 0
else if n6 = "1" then
    set d6 to 32
end if
if n5 = "0" then
    set d5 to 0
else if n5 = "1" then
    set d5 to 16
end if
if n4 = "0" then
    set d4 to 0
else if n4 = "1" then
    set d4 to 8
end if
if n3 = "0" then
    set d3 to 0
else if n3 = "1" then
    set d3 to 4
end if
if n2 = "0" then
    set d2 to 0
else if n2 = "1" then
    set d2 to 2
end if
if n1 = "0" then
    set d1 to 0
else if n1 = "1" then
    set d1 to 1
end if
set decimalString to (d1 + d2 + d3 + d4 + d5 + d6 + d7 + d8)
set asciiString to (ASCII character (decimalString))
return asciiString

1voto

qarma Puntos 71

Tu script puede ser muy simplificado. Lo que parece que estás haciendo es convertir un número binario en base 10 (denario), y de ahí a un código de caracteres. (Nota al margen: Siempre es útil tratar de ser explícito al describir lo que tu código hace--o pretende hacer).

set bits to every character in the text returned of ¬
    (display dialog "Binary Input:" with icon note ¬
    buttons {"Cancel", "Convert"} default button 2 ¬
    with title "Binary to Text Conversion")

set |2ⁿ| to 1 -- powers of 2, i.e. 2⁰, 2¹, 2², 2³,..., 2⁷
set d to 0    -- the base 10 value (replaces your decimalString)

repeat with bit in the reverse of the bits
    set d to d + bit * |2ⁿ|
    set |2ⁿ| to 2 * |2ⁿ|
end repeat

set char to character id d
return char

Se desea repetir este proceso varias veces para convertir tantos números binarios como el usuario suministre. No hay muchas opciones para permitir fácilmente obtener múltiples valores de un usuario. Pero parece que usted está experimentando con la codificación binaria/texto de los datos, y que estos números binarios probablemente representan 8 bits de un solo byte de datos, por lo tanto parece razonable dejar que un usuario suministre tantos bytes de datos que desee en un solo diálogo de entrada, simplemente separando cada valor binario por un espacio, por ejemplo

"1011010 11010011 01011000 ..."

que representaría tres bytes de datos en forma binaria que son fáciles de dividir en elementos individuales y convertir uno por uno.

Para ello, tiene sentido poner el trozo de código que hace la conversión base dentro de un handler (función) que puede reutilizarse una y otra vez para realizar tantas conversiones como se necesite sin tener que escribir una y otra vez un código idéntico.

Aquí hay un borrador de un script que hace todo esto:

set bytes to every word in the text returned of ¬
    (display dialog "Binary Input:" with icon note ¬
    buttons {"Cancel", "Convert"} default button 2 ¬
    with title "Binary to Text Conversion")

set chars to {} -- this will fill with each decimal conversion

repeat with bits in bytes
     -- call the handler below
    set end of chars to the decimal from bits
end repeat

-- Now convert the decimal numbers to text
return character id chars

# A handler that takes a binary number and returns its decimal
# representation.  The binary value can be passed in any of the
# following ways:
#        1. a list of characters of numbers
#             e.g. {0, 1, 0, 1, 1, 0, 1, 0}, or
#                  {"0", "1", "0", "1", "1", "0", "1", "0"}  
#        2. a string, e.g. "01011010"
#        3. a number, e.g. 1011010
to decimal from binary as {list, text, integer}
    local binary

    set |2ⁿ| to 1
    set d to 0

    tell a reference to binary to if its class ≠ list then ¬
        set the contents to the characters of (it as text)

    repeat with bit in the reverse of the binary
        set d to d + bit * |2ⁿ|
        set |2ⁿ| to 2 * |2ⁿ|
    end repeat

    return d
end decimal

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X