Cómo desarrollé un editor binario que se ejecuta en el navegador
¿Qué es un editor binario?
Un editor binario es una herramienta que permite editar archivos directamente en notación hexadecimal o ASCII. Mientras que un editor de texto convencional trabaja con “cadenas”, un editor binario accede a la secuencia bruta de bytes de un archivo y permite modificar cualquier bit o byte en una posición arbitraria.
Son imprescindibles para el análisis de software, la recuperación de datos o la investigación de protocolos. Entre las aplicaciones de escritorio, HxD
o Binary Ninja
son muy conocidas. Sin embargo, mi objetivo en esta ocasión era crear un editor binario de archivo único que funcionara solo en el navegador.
Enfoque de implementación
- Completamente del lado del cliente (sin transmisión de datos)
- Cargar archivos locales mediante la API
FileReader
- Mostrar el hexadecimal (Hex) a la izquierda y el ASCII a la derecha
- Entrar en modo edición con un clic y sobrescribir valores directamente
- Resaltar en rojo las celdas editadas
- Permitir alternar entre modo de edición Hex y modo de edición ASCII
- Descargar de nuevo el resultado editado como archivo
Tropiezos reales y cómo los resolví
1. El marco de edición se desplazaba
En la primera versión, el contorno amarillo que marcaba la celda en edición quedaba ligeramente descentrado y se veía raro. La causa era que, debido al line-height
de CSS y a la distribución mediante flex
, la referencia del carácter y la del contorno no coincidían. Aunque usaba una fuente monoespaciada, el motor de renderizado del navegador coloca la línea base de cada fuente de forma distinta, de modo que el marco terminaba subiendo o bajando.
Forcé vertical-align: middle
y cambié la celda a inline-block
para igualar alturas, lo que eliminó el problema.
.hex-cell.editing {
outline: 2px solid yellow;
vertical-align: middle;
}
2. La tecla ESC escribía caracteres
Al principio, si pulsaba ESC con una celda activa aparecían caracteres como “EE”.
El motivo era que no interceptaba el evento keydown
, así que el navegador enviaba el código de la tecla directamente al flujo de entrada. El manejador solo esperaba 0–9 y A–F, pero Escape
también tiene código propio (keyCode = 27
en implementaciones antiguas, key = "Escape"
en la API moderna). Sin un filtro, el proceso interpretaba la entrada como el carácter "E"
, de ahí que se escribiera "EE"
.
La solución fue sencilla: capturar Escape
en keydown
, cancelar la edición y evitar el procesamiento por defecto.
document.addEventListener("keydown", e => {
if (e.key === "Escape") {
cancelEdit();
e.preventDefault(); // Impedir que llegue a la ruta de entrada genérica
}
});
Así ESC pasó a actuar solo como “cancelar edición” y dejó de escribir letras.
3. Las celdas rojas quedaban después de recargar
Tras editar un archivo, si abría otro distinto quedaban los resaltados en rojo.
La causa era que el arreglo y el estado que rastreaban las celdas modificadas no se reiniciaban al cargar un nuevo archivo. Vaciar la zona visible no bastaba, porque la marca de “modificado” seguía activa y hacía parecer que el nuevo archivo también estaba editado.
Añadí una llamada a clearModifiedState()
justo después de la carga para borrar esas marcas y restaurar el estilo neutro.
4. Alternar entre modos HEX y ASCII
La primera versión permitía editar simultáneamente en HEX y ASCII. Esto hacía difícil saber qué entrada tenía prioridad, y editar el mismo byte por dos rutas generaba conflictos. Al escribir en ASCII se sobrescribía el valor HEX, pero durante la introducción aparecían inconsistencias momentáneas.
Para evitar esa confusión cambié a un selector explícito de modo y dejé como predeterminado el modo HEX. Así el usuario sabe siempre qué está editando, y la lógica de sincronización se simplifica.
Fragmento de código
La rutina de escritura quedó así:
function applyEdit(offset, newValue) {
if (mode === "hex") {
buffer[offset] = parseInt(newValue, 16);
} else {
buffer[offset] = newValue.charCodeAt(0);
}
markModified(offset);
render();
}
markModified(offset)
añade la clase de resaltado en rojo si el valor difiere del original; es una implementación sencilla.
Conclusión
El editor binario para navegador que desarrollé funciona sin conexión y es un “tool” completamente del lado del cliente, seguro desde la perspectiva de seguridad.
- Para pequeños retoques binarios
- Para investigaciones en entornos donde no se puede instalar software
- Para comprender de forma intuitiva las secuencias de bytes en educación o autoaprendizaje
Esos son los escenarios donde puede aprovecharse.