Saya sedang mengusahakan projek yang melibatkan pemampatan kandungan, yang memerlukan data diproses secara binari (seperti pemampatan LZ77, pengekodan Huffman, dll.), yang melibatkan banyak fungsi dan fungsi.
Tetapi apabila saya melakukannya sendiri, saya mendapati bahawa walaupun C++ menyediakan operasi binari yang agak komprehensif, ia terutamanya berdasarkan jenis data tertentu untuk operasi binari (seperti char), dan char ialah 8-bit secara lalai, yang bukan sesuai untuk operasi merentas aksara Ia sangat mudah dan memerlukan banyak pertimbangan.
Mungkin apa yang saya luahkan tidak begitu jelas, atau ada masalah dengan pemahaman saya tentang C++, tetapi saya berharap untuk mencari kaedah yang boleh mengendalikan binari dengan cara yang lancar... Atau adakah perpustakaan yang lebih mudah digunakan?
Adakah sesiapa yang mempunyai pengalaman dalam bidang ini dan boleh memberikan nasihat saya akan sangat berterima kasih.
Jika anda mahukan julat aksara yang lebih besar, anda boleh menggunakan wchar_t.
Jika anda mahukan jenis yang boleh menggunakan sebarang bit sebagai permulaan bait dalam data dalam ingatan, pastinya mustahil untuk dicapai.
Tetapi anda boleh
`nl=((arr[0]&c0)>>6);
nh=((arr[1] &0x0f) << 2);
n=nh|nl;`
Untuk menggabungkan 2 bit tinggi bait sebelumnya dan 4 bit rendah bait seterusnya menjadi nombor binari 6 digit
semuanya dalam binari, tetapi juga pertimbangkan aksara?
Binari hanya perlu mempertimbangkan bait, bukan?
Dari segi algoritma pemampatan, aksara selalunya tidak dipertimbangkan kerana fail input mungkin ASCII, UTF-8 atau UTF-16 (LE/ BE), atau GBK, dll. Tetapi dalam analisis akhir, persamaan bahasa ialah terdapat undang-undang tertentu dalam statistik.
Sebagai contoh, e kerap muncul dalam bahasa Inggeris, atau perkataan seperti adalah kerap muncul, atau imbuhan seperti se dan tor kerap muncul.
Prinsip asas pemampatan ialah menggunakan sesedikit mungkin bit untuk mewakili perkara yang kerap muncul dan mengurangkan lebihan, secara amnya, ia tiada kaitan dengan aksara.
Anda harus mengetahui lebih lanjut tentang algoritma pemampatan LZ77/LZ78/Huffman semuanya adalah algoritma pemampatan umum.
Kembali ke C++, C++ memerlukan saiz sesuatu boleh diketahui pada masa penyusunan (memori yang diperuntukkan tindanan ditentukan oleh pengkompil), tetapi teks input hanya diketahui semasa runtime, jadi secara teori tidak ada kaedah yang baik . Set aksara dan pengekodan teks adalah lubang yang dalam, dan tidak disyorkan untuk melompat ke dalamnya.
Jika anda ingin melakukan operasi dalam unit bit, rangkumkan perpustakaan sendiri, atau terdapat beberapa perpustakaan seperti rangsangan yang boleh digunakan. Lagipun, minimum dalam CPU ialah satu bait, tetapi ia hanya boleh beroperasi setiap bit di dalamnya.