Saya sedang mengerjakan masalah dalam Pemrograman Mutiara - khususnya, implementasi program yang mengurutkan file yang berisi paling banyak 10.000.000 bilangan bulat (Kolom 1, Masalah 3). Karena buku itu tidak menentukan bagaimana data harus disimpan dalam file, saya mempertimbangkan menyimpan integer sebagai byte mentah (ada beberapa kendala lain yang membuat byte mentah menjadi pilihan yang baik). Saya belum pernah bekerja di level rendah ini sebelumnya, jadi saya ingin tahu apakah ada sesuatu yang berbahaya yang harus saya perhatikan. Apakah saya perlu khawatir tentang tidak sengaja menggunakan semacam urutan end-of-file ketika saya sedang menulis byte mentah ke file, misalnya?
Edit:
Saya menyadari sekarang seberapa luas pertanyaan saya. Saya benar-benar memaksudkan masalah yang lebih berbahaya, seperti menimpa file-file lain di disk secara tidak sengaja. Maaf saya awalnya tidak jelas.
Jawaban:
Satu-satunya bahaya yang akan Anda hadapi adalah sedikit vs endianess besar (apakah byte paling signifikan atau paling tidak ditulis pertama). Namun jika Anda tetap berada di lingkungan yang sama tidak akan ada masalah. selain memastikan umum menulis / parsing pulang pergi.
Sistem file dirancang untuk menangani urutan byte apa pun.
sumber
Tidak, sebenarnya ini adalah berapa banyak format file berfungsi. Contoh umum file biner seperti ini termasuk file gambar dan musik / audio.
Untuk menjaga integritas file dan data yang membacanya, pastikan untuk mengikuti panduan ini:
Rincian spesifik akan bervariasi berdasarkan kerangka kerja, platform, dan bahasa, tetapi ini harus mencakup "gotchas" dasar dengan file I / O.
sumber
int
dapat antara 2 dan 8 atau lebih byte (benar-benar oktet).int
pada dua mesin yang berbeda dapat dianggap tipe data yang berbeda.Selain semua gotchas yang telah disebutkan, jika Anda membuat format file biner baru daripada membaca dan menulis data dalam format yang sudah ada, sangat penting bahwa Anda menyertakan header file : blok data di awal file yang jelas mengidentifikasi format file dan mencatat setiap metadata yang mungkin diperlukan.
Header file yang baik mencakup setidaknya tiga hal:
" Angka ajaib ", paling tidak empat byte. Angka ajaib HARUS rfc2119 menjadi N byte pertama dalam file, HARUS tidak pernah digunakan untuk format file lain yang dapat Anda gali, dan HARUS berisi setidaknya satu byte yang bukan karakter ASCII yang dapat dicetak. Lihat spesifikasi PNG untuk cara mendesain angka ajaib yang sangat menyeluruh . Lihat kode sumber
file(1)
perintah untuk basis data angka ajaib yang ada yang komprehensif seperti yang mungkin Anda temukan.Maksud dari angka ajaib adalah memberi label yang jelas pada file, in-band, dengan formatnya. Jika Anda tidak menyertakan nomor ajaib, atau itu tidak hal pertama dalam file, Anda menjalankan resiko program misidentifying file Anda sebagai beberapa lainnya jenis file, yang mengarah ke hilangnya data, virus melarikan diri deteksi , dan seperti lainnya malapetaka.
Indikasi versi format file. Bahkan jika Anda berpikir Anda tidak akan pernah harus merevisi format file Anda secara drastis, buat dua byte berikutnya setelah angka ajaib menjadi
00 00
dan mendokumentasikan bahwa ini adalah nomor versi 16-bit dalam beberapa endianness yang pasti (mana pun yang Anda suka, tetapi pilih satu dan menempel di seluruh file ) dan akan bertambah jika arti dari data selanjutnya berubah secara radikal. Masa depan Anda akan berterima kasih.(Spesifikasi PNG mengambil rute yang berbeda di sini, menetapkan bahwa format chunk dibekukan, dan bahwa semua perubahan di masa depan pada format tersebut akan mengambil bentuk tipe chunk baru. Itu juga valid, tetapi saya merekomendasikan pendekatan angka sulap sederhana + nomor versi untuk pemula hingga pemrosesan data biner. Orang-orang yang mendesain PNG menggunakan pengalaman puluhan tahun bersama dengan format gambar.)
Beberapa jenis mekanisme untuk menanamkan metadata sewenang-wenang dalam file. Ini bisa sesederhana memiliki dua byte berikutnya menjadi offset 16-bit dari ujung header ke awal data aktual, dengan segala sesuatu di antaranya ditafsirkan sebagai pasangan nilai kunci UTF-8 a la RFC 822 (yaitu, "
Tag: value\n
" - jika Anda memilih rute ini, saya sarankan untuk tidak melipat garis panjang). Sekali lagi, PNG jauh lebih pintar.sumber
Arsitektur yang berbeda memiliki representasi yang berbeda untuk bilangan bulat. Risiko utama di sini adalah menyimpan representasi byte dari integer di mesin A dan kemudian mencoba membaca kembali dan menafsirkan konten sebagai integer di mesin B. Jika mesin A dan B memiliki ukuran yang berbeda untuk integer dan / atau endianness yang berbeda , Anda harus ll kemungkinan besar akan menyebabkan perilaku yang tidak terdefinisi (misalnya dalam C) atau pengecualian.
Karena ini hanyalah contoh pemrograman dan bukan program "nyata", ini bukan masalah. Jika ini adalah program nyata, menggulung format biner khusus aplikasi Anda sendiri biasanya bukan ide yang baik; ada solusi yang lebih baik, seperti SQLite atau format serialisasi berbasis string seperti JSON, YAML, XML, dll. Untuk nilai tunggal mengubahnya menjadi string sudah cukup; untuk daftar sederhana Anda dapat menyimpan satu string per baris dan cukup membagi input pada baris baru ketika Anda membacanya kembali.
sumber