Pengalaman mengembangkan editor biner yang berjalan di browser
Apa itu editor biner?
Editor biner adalah alat yang memungkinkan kita mengedit file secara langsung dalam representasi heksadesimal atau ASCII. Berbeda dengan teks editor biasa yang mengubah “string”, editor biner memberi akses ke “deret byte mentah” yang dimiliki file sehingga kita bisa memodifikasi bit atau byte pada posisi mana pun.
Dalam analisis perangkat lunak, pemulihan data, atau penelusuran protokol, alat ini tidak tergantikan.
Untuk aplikasi GUI, contoh populer adalah HxD
atau Binary Ninja
.
Target saya kali ini berbeda: editor biner satu file yang berjalan sepenuhnya di browser.
Pendekatan implementasi
- Seluruh proses di sisi klien (tanpa pengiriman data)
- Membaca file lokal dengan API
FileReader
- Menampilkan hex di sisi kiri dan ASCII di sisi kanan
- Klik untuk masuk ke mode edit dan menimpa nilai secara langsung
- Menyorot area yang diedit dengan warna merah
- Bisa berganti mode edit HEX / ASCII
- Hasil edit dapat diunduh kembali sebagai file
Titik tersandung dan perbaikannya
1. Bingkai edit yang tidak tepat posisi
Pada implementasi awal, bingkai kuning yang menunjukkan sel yang sedang diedit sedikit bergeser dan terlihat aneh.
Penyebabnya adalah titik acuan antara karakter dan bingkai tidak sejajar karena pengaruh line-height
CSS dan tata letak flex
.
Walau memakai font monospace, proses rendering browser bisa memberikan baseline berbeda antarpengguna sehingga bingkai tampak condong ke atas atau ke bawah.
Solusinya adalah memaksa vertical-align: middle
dan mengubah elemen menjadi display: inline-block
agar tinggi antar elemen seragam.
.hex-cell.editing {
outline: 2px solid yellow;
vertical-align: middle;
}
2. Menekan ESC malah memasukkan karakter
Awalnya, ketika bingkai edit muncul lalu saya menekan ESC, sel justru terisi huruf seperti “EE”.
Penyebabnya adalah tidak ada penanganan keydown
, sehingga browser meneruskan kode karakter yang ditekan langsung ke proses input sel.
Rutinitas input sebenarnya hanya mengizinkan 0–9 dan A–F, tetapi Escape
juga punya kode (implementasi lama memakai keyCode=27
, spesifikasi modern memakai key="Escape"
).
Kode itu tanpa sengaja melewati jalur input dan ditafsir sebagai "E"
, sehingga muncul “EE”.
Solusi yang diambil sederhana: tangkap Escape
lewat event keydown
, ubah menjadi operasi pembatalan edit, dan hentikan alur input normal.
document.addEventListener("keydown", e => {
if (e.key === "Escape") {
cancelEdit();
e.preventDefault(); // jangan teruskan ke alur input utama
}
});
Dengan begitu ESC hanya berfungsi sebagai “batalkan edit” dan tidak lagi menuliskan karakter.
3. Sorotan merah tertinggal setelah memuat ulang
Saat file baru dimuat setelah sebelumnya mengedit file lain, sorotan merah dari file lama masih muncul.
Ini terjadi karena larik dan status yang melacak sel yang sudah diedit tidak diinisialisasi ulang saat memuat file baru. Meski area tampilan sudah dibersihkan, “flag perubahan” internal masih tersisa sehingga file baru tetap dianggap merah.
Perbaikannya adalah memanggil clearModifiedState()
segera setelah file dibaca untuk mereset flag tersebut sepenuhnya.
4. Pergantian mode HEX/ASCII
Implementasi pertama mengizinkan pengeditan HEX dan ASCII secara bersamaan. Akibatnya pengguna bingung menentukan “mana yang benar”. Karena satu byte dipegang dua jalur input sekaligus, muncul konflik ketika sel yang sama ditimpa lewat jalur berbeda. Saat mengetik ASCII, representasi HEX langsung ditulis ulang, tetapi selama proses input sempat terlihat keadaan yang tidak sinkron.
Untuk menghindari kekacauan itu, mode diedit menjadi pilihan eksplisit lewat select box, dan default-nya disatukan ke edit HEX. Dengan begitu pengguna tahu “saat ini saya mengedit HEX” dan proses sinkronisasi menjadi lebih sederhana.
Cuplikan kode
Bagian pengeditan utama saya implementasikan seperti berikut.
function applyEdit(offset, newValue) {
if (mode === "hex") {
buffer[offset] = parseInt(newValue, 16);
} else {
buffer[offset] = newValue.charCodeAt(0);
}
markModified(offset);
render();
}
markModified(offset)
dipakai untuk menyorot sel merah.
Implementasinya sederhana: ketika nilainya berbeda dari data awal, kelas khusus ditambahkan.
Rangkuman
Editor biner versi browser ini dapat berjalan offline dan aman secara keamanan karena sepenuhnya sisi klien.
- Cocok untuk koreksi biner ringan
- Berguna ketika lingkungan tidak mengizinkan instalasi aplikasi khusus
- Bermanfaat di kelas atau sesi belajar untuk memahami “deret byte” secara intuitif
Itulah skenario utama di mana alat ini bisa membantu.