Properti Mikro adalah serializer data biner minimalis untuk sistem tertanam. Bagian 2

Beberapa waktu lalu saya menerbitkan artikel saya tentang perkembangan sepeda sepeda, di mana saya menjelaskan alasan yang mendorong saya melakukan ini.



Singkatnya, saya membutuhkan perpustakaan miniatur untuk mikrokontroler dengan serializer data biner dan transmisi selanjutnya dari pesan-pesan ini melalui jalur komunikasi berkecepatan rendah, sedangkan format biasa xml, json, bson, yaml, protobuf, Hemat, ASN.1, dll. tidak cocok karena berbagai alasan.



Seperti yang diharapkan, solusinya ternyata lebih dari sekadar sepeda, namun, publikasi artikel di Habré sangat membantu saya. Faktanya adalah bahwa selama analisis awal dari perpustakaan yang mungkin, untuk beberapa alasan saya mengabaikan serializers MessagePack, CBOR dan UBJSON.



Tautan ke mereka ditulis kepada saya di komentar setelah publikasi artikel. Dan saya segera menyadari bahwa kemungkinan besar CBOR , UBJSON dapat dengan mudah menyelesaikan masalah sebelum saya. Dan mereka melakukannya jauh lebih baik daripada perkembangan saya sendiri.



Setelah itu, saya mengacaukan antarmuka saya ke perpustakaan CBOR (agar tidak menyekop sumber), dan ... memutuskan untuk meninggalkan format ini demi MessagePack :-)









CBOR vs. MessagePack



Sebenarnya format CBOR dan MessagePack menggunakan prinsip serialisasi data yang sama. Mereka didasarkan pada metode praktis penulisan TLV , dengan satu-satunya pengecualian bahwa dalam bentuk klasik, TLV selalu berisi bidang tag dan bidang panjang data. Tetapi bidang dengan datanya sendiri mungkin tidak ada (jika ukuran datanya nol).



Dan dalam serializers ini, pengembang melangkah lebih jauh, dan membuat format yang hampir cerdik di mana keberadaan bidang dengan ukuran data bergantung pada tipe data dan tidak diperlukan untuk bidang berukuran tetap, dan byte pertama menyimpan kedua jenis bidang dengan ukuran data dan langsungnya. nilai (tentu saja, jika kedalaman bit memungkinkan).



Dalam artikel asli , saya menulis tentang fakta bahwa saya memerlukan pengemasan maksimum data biner, dan kedua format ini mengatasi tugas ini dengan keras. Mereka sangat mirip satu sama lain, dan hanya berbeda dalam jumlah bit tempat nilai jenis bidang disimpan.



Dalam format CBOR, overhead penyimpanan minimum untuk setiap bidang adalah tiga bit, yaitu. di byte pertama dari setiap bidang, tiga bit pertama bertanggung jawab atas jenis konten, dan bergantung padanya, keberadaan dan ukuran bidang lain diinterpretasikan, dan 5 bit yang tersisa mungkin sudah berisi nilai bidang itu sendiri.



Tapi MessagePack melangkah lebih jauh! Dalam format ini, overhead penyimpanan minimum untuk sebuah nilai hanya 1 (SATU!)sedikit informasi. Karenanya, 7 bit dapat digunakan untuk menyimpan informasi tambahan, dan nilai dengan kumpulan bit paling signifikan digunakan untuk menunjukkan informasi tambahan tentang jenis bidang.



Jelas bahwa kisaran representasi nilai negatif dengan metode pengkodean ini berkurang karena bilangan positif (hanya 32 bilangan negatif yang dapat disimpan dalam satu byte, dan nilai lainnya akan membutuhkan byte kedua). Tetapi ini adalah ketidakseimbangan yang benar dan itu bergeser ke arah yang benar, karena dalam praktiknya, bilangan positif lebih sering digunakan daripada bilangan negatif.



Dengan kata lain, satu byte dalam format CBOR dapat menampung nilai integer dari 0 hingga 23, dan dalam format MessagePack dari 0 hingga 127!



Momen inilah, serta pustaka normal dengan implementasi format dalam selusin bahasa yang berbeda, yang menentukan pilihan akhir saya yang mendukung format MessagePack. Menurut saya, saya bukan satu-satunya yang mungkin tertarik dengan detail penerapan format ini, jadi menurut saya informasi ini tepat untuk dibagikan.



Akibatnya, format asli serializer dibuat lebih ringkas, termasuk karena beberapa konvensi (misalnya, struktur data yang dikodekan harus dibatasi hanya pada daftar datar dan penolakan untuk menggunakan jenis yang tidak diklaim), dan tidur saya menjadi lebih tenang, karena tidak lagi pusing tentang kompatibilitas pada tingkat format pesan yang diteruskan antar perangkat.

Terima kasih banyak untuk pengguna Habra Spym dan edo1hyang menanggapi posting sebelumnya dan dengan demikian membantu menemukan solusi untuk masalah yang sangat serius dengan sedikit usaha!

Sumber utama:



Spesifikasi CBOR . Ada artikel bagus dengan deskripsi tentang Habré .



Spesifikasi MessagePack sangat mudah dibaca di dokumentasi dan tidak memerlukan terjemahan atau penjelasan tambahan.



All Articles