Keluaran bencode kanonis
Kodekan byte, bilangan bulat terbatas, daftar dan kamus berkunci byte menjadi bencode kanonis terurut dengan keluaran maksimal 65536 byte.
def bencode(value):
active, visited, used, parts = set(), 0, 0, []
def emit(*chunks):
nonlocal used
size = sum(len(chunk) for chunk in chunks)
if size > 65536 - used:
raise ValueError("bencode.output")
used += size
parts.extend(chunks)
def encode(item, depth):
nonlocal visited
visited += 1
if depth > 16 or visited > 2048:
raise ValueError("bencode.bounds")
if type(item) is int:
if not -10**18 <= item <= 10**18:
raise ValueError("bencode.integer")
emit(b"i", str(item).encode("ascii"), b"e")
elif type(item) is bytes:
if len(item) > 65536:
raise ValueError("bencode.bytes")
emit(str(len(item)).encode("ascii"), b":", item)
elif type(item) in (list, dict):
if id(item) in active or len(item) > 64:
raise ValueError("bencode.container")
active.add(id(item))
try:
emit(b"l" if type(item) is list else b"d")
if type(item) is list:
for child in item:
encode(child, depth+1)
else:
if any(type(k) is not bytes for k in item):
raise ValueError("bencode.key")
for key in sorted(item):
encode(key, depth+1)
encode(item[key], depth+1)
emit(b"e")
finally:
active.remove(id(item))
else:
raise ValueError("bencode.type")
encode(value, 0)
return b"".join(parts)
- Proyek
- Uji wadah kosong dan kedalaman, tolak siklus, boolean, bilangan di luar ±10^18, lebih dari 64 entri per wadah, kedalaman di atas 16 atau lebih dari 2048 nilai dikunjungi.
- Tinjau sebelum menerapkan
- Bandingkan perilaku sebenarnya dengan hasil yang diharapkan. Jika pemeriksaan gagal, cari penyebabnya sebelum membuat perubahan lain.
- Model
- Atur endpoint kompatibel OpenAI atau Anthropic dengan URL dasar dan kunci API jika diperlukan. Uji koneksi. Server model lokal harus berjalan; alat jarak jauh dapat mengirim data secara terpisah.
def bencode(value):
active, visited, used, parts = set(), 0, 0, []
def emit(*chunks):
nonlocal used
size = sum(len(chunk) for chunk in chunks)
if size > 65536 - used:
raise ValueError("bencode.output")
used += size
parts.extend(chunks)
def encode(item, depth):
nonlocal visited
visited += 1
if depth > 16 or visited > 2048:
raise ValueError("bencode.bounds")
if type(item) is int:
if not -10**18 <= item <= 10**18:
raise ValueError("bencode.integer")
emit(b"i", str(item).encode("ascii"), b"e")
elif type(item) is bytes:
if len(item) > 65536:
raise ValueError("bencode.bytes")
emit(str(len(item)).encode("ascii"), b":", item)
elif type(item) in (list, dict):
if id(item) in active or len(item) > 64:
raise ValueError("bencode.container")
active.add(id(item))
try:
emit(b"l" if type(item) is list else b"d")
if type(item) is list:
for child in item:
encode(child, depth+1)
else:
if any(type(k) is not bytes for k in item):
raise ValueError("bencode.key")
for key in sorted(item):
encode(key, depth+1)
encode(item[key], depth+1)
emit(b"e")
finally:
active.remove(id(item))
else:
raise ValueError("bencode.type")
encode(value, 0)
return b"".join(parts)
Jaga perubahan serialisasi tetap kompatibel dan terbatas
Keluaran biner dapat berubah makna tanpa terlihat berbeda dalam diff teks biasa. Bencora adalah ruang kerja pemrograman AI untuk Windows guna meninjau kode serialisasi dengan memperhatikan risiko tersebut. Buka proyek dan minta model terhubung memeriksa nilai yang diterima, kontrak keluaran, dan kode pengguna sebelum menyarankan tambalan.
Tugas konkret dapat meninjau keluaran bencode kanonis untuk penulis metadata. Minta asisten memeriksa urutan kunci byte, kontainer bersarang, dan penolakan tipe tak didukung. Berikan data uji keluaran yang diketahui dan jelaskan batas yang dibutuhkan aplikasi. Fokuskan usulan pada penulis tersebut dan pemanggilnya, alih-alih menganggap perubahan serialisasi tidak berbahaya hanya karena menghasilkan byte yang tampak valid.
Periksa batas sumber daya bersama konversi bolak-balik biasa. Jalankan pengujian Anda sendiri untuk kedalaman maksimum, keluaran terlalu besar, dan kontainer siklik, serta bandingkan byte eksak untuk kamus representatif. Periksa jalur pembersihan setelah penolakan agar percobaan yang gagal tidak merusak pekerjaan berikutnya. Kompatibilitas memerlukan bukti dari kode pengguna proyek, selain contoh yang berhasil dikodekan.
Bencora mendukung koneksi ke endpoint kompatibel OpenAI atau Anthropic. Model AI tanpa sensor dapat dipilih jika ditawarkan layanan yang dikonfigurasi, dengan alat, batasan, dan konteks yang ditentukan konfigurasi itu. Gunakan percakapan untuk menjelaskan perubahan, sementara data uji Anda memastikan apakah kontrak keluaran tetap utuh.
Meninjau penulis biner dengan aman
Mengapa membandingkan byte eksak, bukan hanya nilai terdekode?
Nilai terdekode yang setara dapat menyembunyikan perbedaan urutan atau representasi yang penting bagi format kanonis. Pertahankan data uji byte yang diketahui untuk persyaratan tersebut dan periksa bersama pengujian bolak-balik yang sudah digunakan proyek.
Konteks apa yang penting bagi urutan kamus?
Tunjukkan tipe kunci sebenarnya dan kode pengguna yang mengandalkan keluaran terkode. Minta asisten membedakan urutan byte dari urutan teks khusus bahasa pemrograman. Konversi string yang praktis dapat mengubah kontrak yang ditetapkan atas byte mentah.
Haruskah batas ukuran keluaran diperiksa hanya setelah pengodean?
Tinjau kebijakan sumber daya yang dibutuhkan aplikasi. Pemeriksaan ukuran akhir mungkin terjadi setelah banyak pekerjaan atau alokasi. Tanyakan tempat usulan menerapkan batas dan uji jalur penolakan, termasuk nilai bersarang yang melebihi keluaran yang diizinkan.
Mengapa menyertakan kasus kontainer siklik?
Kasus itu memeriksa cara penulis menangani masukan yang tidak dapat diperluas sebagai pohon berhingga biasa. Verifikasi penolakan eksplisit dan pembersihan. Contoh pengodean model yang berhasil tidak membuktikan struktur kontainer cacat berhenti dengan benar.
Bencora · Diperbarui 2026-10-25