Web Tools online: Calculadora binaria

Calculadora binaria

Figura
Figura. Calculadora binaria

La calculadora binaria es una pieza de herramienta de Web Tools online para reunir varios recursos relacionados con el cálculo y manejo de números binarios. Tal como se observa en la Figura, cuenta con un convertidor decimal a binario o hexadecimal, la propia calculadora con números binarios, un convertidor a formato IEEE754 de números en coma flotante y un generador de checksums. Las primeras tres piezas son una reimplementación y mejora de las que ya había publicado en la serie de temas sobre los números en JavaScript: convertidor binario decimal, calculadora binaria y convertidor formato IEEE754.

Se agrega una nueva utilidad para generar un checksum o suma de verificación, que es un trozo de datos dentro un conjunto de datos mayor, cuyo propósito es verificar en el destino que no se han producido cambios accidentales durante la transmisión. Inicialmente incluye la generación de CRC.

Convertidor

Figura
Figura. Convertidor binario

El convertidor binario permite la conversión de números y de texto. Podemos entrar un número decimal, binarios o hexadecimal, devolviéndonos la contrapartida en los otros dos formatos. La conversión también puede hacerse sobre números reales, especificándose el número de bits que queremos en la parte fraccionaria. Poco más voy a extenderme sobre esto, pues en los temas de Números en JavaScript se expone todo lo relacionado.

La parte de conversión de texto es algo nuevo que comentaré con más detalle. Si se considera la entrada como un texto nos devuelve los bytes de cada caracter usando el método codePointAt() del objeto String de JavaScript. Este método nos devuelve el código UNICODE en UTF-16 de cualquier carácter que puede tener entre uno y tres bytes. Por ejemplo, "Ñ".codePointAt(0) devuelve 0xD1, un valor igual o menor a 255 (0xFF) y por tanto ocupa un byte. Por otro lado "⇨".codePointAt(0) devuelve 0x21 E8, un valor entre 256 (0x1000) y 65535 (0xFFFF) ocupando dos bytes. Por último "🄬".codePointAt(0) devuelve 0x01 F1 2C, un valor igual o mayor a 65536 (0x10000) hasta el máximo Unicode 0x10FFFF.

El método codePointAt() nos devuelve el código en UTF-16. Sin embargo usualmente codificamos en UTF-8. Si marcamos Usar UTF-8 en la herramienta, entonces se extraen los bytes en esa codificación. Así "A" nos devuelve 0x41 con un byte. "Ñ" nos devuelve 0xC3 91 con dos bytes. "⇨" devuelve 0xE2 87 A8 con tres bytes. "🄬" devuelve 0xF0 9F 84 AC con cuatro bytes.

La operación inversa para convertir un código UTF-8 a un carácter también es posible. Pasando F0 9F 84 AC, separando por espacio cada byte, obtendremos el carácter "🄬" y los bytes en binario 11110000 10011111 10000100 10101100. Hay una opción para permitir errores UTF-8, pues si están mal formados causará error. Por ejemplo 10 9F 84 AC donde cambiamos la primera F por un 1 causará error porque es un código UTF-8 mal formado. Si permitimos errores considerará cada byte separadamente en UTF-8 generando la cadena "���".

La conversión de texto a bytes en UTF-8 se lleva a cabo básicamente usando encodeURIComponent de JavaScript, que codifica una cadena escapando los caracteres con una secuencia de escape para poder incluirlos en una URI. La operación inversa es decodeURIComponent. Por otro lado puede ver más sobre el tema de Algoritmos UTF-8 para entender como funciona la codificación UTF-8

Calculadora

Figura
Figura. Calculadora binaria

La calculadora binaria que incluí en la serie de temas sobre los números en JavaScript sólo contemplaba las operaciones aritméticas básicas suma, resta, multiplicación y división. Ahora se amplia con la operación módulo (MOD) y con la posibilidad de realizar esas operaciones en aritmética módulo 2. Esto se explica en el apartado Aritmética binaria sin acarreos para generar CRC. Se mejora con la posibilidad de obtener una traza de la operación, como por ejemplo 11010110 × 1011 obteniéndose la siguiente traza:

11010110 1011 ──────────── 11010110 11010110 11010110 ──────────── 100100110010

Se mejora agregando operadores de comparación entre dos números: igual, distinto, mayor o igual, menor o igual, mayor y menor.

Y también se agregan operadores a nivel de bit con negación (~), AND (&), OR (|), XOR (^), desplazamiento izquierda (<<) y desplazamiento derecha (>>). También se incluye la función reverse() para invertir los bits de un binario. En el apartado detalles de implementación con números binarios en JavaScript se comenta estos operadores en relación con la necesidad de utilizarlos en la implementación de algoritmos para generar CRC.

IEEE754

Figura
Figura. Formato IEEE754

El convertidor formato IEEE754 es el mismo que el incluido en la serie de temas sobre números en JavaScript. Su próposito es convertir un número decimal al formato IEEE754 y así aprender como funciona este formato.

Checksum: CRC

Figura
Figura. Checksum: CRC

Por último agregamos la nueva pieza para la generación de códigos de verificación o checksum. Se trata de generarlo desde un contenido de archivo o bien escribiendo ese contenido en el área de texto. Permite vistas de los bytes en UTF-8, ASCII, CP437, binaria, hexadecimal y decimal. A excepción de CP437, en las otras vistas podemos introducir bytes manualmente en el área de texto. Por ejemplo, si queremos introducir un byte cero no lo podemos hacer con UTF-8 o ASCII desde el teclado, pero si con la vista binaria introduciendo 00000000, hexadecimal 00 o decimal 0. Por ahora sólo incluye la gestión de CRC (código de redundancia cíclica), pero tal como lo he estructurado podría incluir otros checksums en el futuro.

He creado esta herramienta para aprender como funcionan los algoritmos CRC. La verificación CRC es una información redundante que se agrega a un mensaje con objeto de verificar en la recepción si el mensaje ha sido modificado no intencionadamente durante la transmisión. El CRC no sirve para verificar la autencidad del mensaje, pues cualquiera puede modificar el mensaje y la información redundante, con lo que en el destino el mensaje parecerá correcto. Pero si sirve para verificar cambios ocasionados por errores en la transmisión.