Bibliothèque de décompression compacte pour utilisation intégrée
Nous sommes actuellement à la création d'un dispositif pour un client et d'obtenir un bloc de données (comme, disons, 5-10 KB) à partir d'une application PC. C'est un peu simplifié, de sorte supposer que les données doivent être transmises et non compressé beaucoup, et pas seulement une fois par an. Le canal de communication est vraiment, vraiment lent, donc nous aimerions compresser les données à l'avance, passez à l'appareil et laissez-le décompresser les données de sa mémoire flash interne. L'appareil lui-même, cependant, fonctionne sur un micro contrôleur qui n'est pas très rapide et ne prend pas beaucoup de mémoire. Il a assez de mémoire flash pour stocker le résultat, et peut décompresser le bloc de données qu'il est reçu, mais il peut ne pas avoir assez de RAM pour stocker l'ensemble de l'compressé ou non compressé (ou même les deux!) les blocs de données. Et bien sûr, il n'a pas un système d'exploitation ou de luxe.
Cela signifie que nous avons besoin de suffisamment rapide décompression algorithme n'utilise pas beaucoup de mémoire. La compression peut être lent et laid, puisque nous le faisons sur le côté PC. C ou .NET code préféré, bien que pour la compression, pour faciliter les choses. La décompression code doit être en C, car il est peu probable que quelqu'un a l'ASM version optimisée de notre contrôleur.
Nous avons trouvé LZO, qui serait presque parfait pour nous, mais il a un soi-disant "libre" license (GPL) par défaut, ce qui le rend totalement inutilisable pour notre client. L'auteur dit que les licences commerciales sont disponibles sur demande, mais malheureusement, il est actuellement inaccessible (pour des raisons non techniques, comme les nouvelles sur son site de le dire).
J'ai trouvé quelques autres bibliothèques, y compris la bouffée.c à partir de zlib, et nous sommes toujours en train d'enquêter, mais j'ai pensé que je voudrais vous demander votre expérience:
Qui l'algorithme de compression et/ou de la bibliothèque recommandez-vous pour l'embarqué fins, étant donné que l'appareil de décompression a vraiment des ressources limitées et le code source et une licence commerciale sont nécessaires?
source d'informationauteur OregonGhost
Vous devez vous connecter pour publier un commentaire.
Vous voudrez peut-être consulter un de ces qui ne sont pas GPL et sont assez compact implémentations:
Ces algorithmes sont tous basés sur l'algorithme de Lempel–Ziv–Welch (Ils ont tous LZ en commun)
https://en.wikipedia.org/wiki/Lempel-Ziv-Welch
J'ai utilisé LZSS. J'ai utilisé code de Haruhiko Okumura comme base. Il utilise la dernière partie de données non compressées(2K) comme dictionnaire. Ce code peut être modifié pour ne pas nécessiter un temporaire de l'anneau de la mémoire tampon si vous n'avez pas de mémoire. La licence n'est pas clair à partir de son site, mais quelques les versions a été libéré avec un "d'Utiliser, de distribuer et de modifier ce programme librement" de la ligne et que le code est utilisé par les fournisseurs commerciaux.
Ici est une application basé sur le même code, qui fait partie de l'Allegro de la ludothèque. Allegro de licence est cadeaux ou zlib.
Une autre option pourrait être la lzfx lib qui mettent en œuvre des LZF. Je n'ai pas encore utilisé, mais il semble beau. Utilise également les résultats précédents, donc il a de faibles besoins en mémoire et est publié sous une Licence BSD.
Une alternative pourrait être l'LZ77 codeur/décodeur dans la Compression De Base De La Bibliothèque.
Car il utilise l'déballé les données de l'histoire de son dictionnaire, il n'utilise pas de RAM supplémentaire, sauf pour le compressés et non compressés tampons de données. Il devrait être idéal pour votre cas d'utilisation (licence zlib, C portable). L'ensemble du décodeur est à seulement 70 lignes de code (y compris les commentaires), et très rapide.
EDIT: Encore une autre alternative est le liblzg de la bibliothèque, qui est une version améliorée de ladite LZ77 codeur/décodeur. Il compresse mieux, est généralement plus rapide, et ne nécessite pas de mémoire pour la décompression. Il est très, très libre (licence zlib).
Dépend beaucoup de la nature des données. Si c'est assez simple, vous ne pouvez pas besoin de quelque chose de très chics. Par exemple, si les données téléchargées était une simple image (par exemple quelque chose comme une ligne graphique), une course simple codage par longueur de réduire les données d'un facteur de dix, et vous aurait besoin de trivial quantités de code et de la RAM pour le décoder.
Bien sûr, si les données sont plus complexes, alors ce ne sera pas d'une grande utilité. Mais j'aimerais commencer par explorer les données envoyées et voir si il ya des aspects spécifiques qui vous permettra de compresser de manière plus efficace que l'aide d'un algorithme universel.
Je recommanderais ZLIB.
À partir du wiki:
La bibliothèque offre des installations pour le contrôle du processeur et l'utilisation de la mémoire
Il y a aussi des installations pour en conserver la mémoire. Ces sont probablement utiles dans la mémoire restreinte des environnements tels que certains systèmes embarqués.
zlib est également utilisé dans de nombreux appareils embarqués, car le code est portable, généreusement sous licence
et a un relativement faible empreinte mémoire.
Vous pourriez vouloir vérifier Jørgen Ibsen, aPlib - quelques extraits de la page de produit:
La bibliothèque de compression est closed-source (oui, je sais que cela pourrait être un problème), mais a des bibliothèques précompilées pour une variété de compilateurs et systèmes d'exploitation, y compris les versions 32 et 64 bits. Il y a C et x86 assemblée de code source pour le décompresseur.
EDIT:
Jørgen dispose également d'un libre (licence zlib) BrifLZ de la bibliothèque, vous pouvez vérifier si ne pas avoir de source compressor est un gros problème.
J'ai vu des gens utiliser 7zip sur un système embarqué avec la mémoire dans les dizaines de méga-octets.