Comment pourrais-je encoder une chaîne de 1 et de 0 pour le transport?

Pour une application d’algorithme génétique, j’utilise toute une charge de chaînes binarys. La plupart du temps, ils prennent littéralement la forme 01001010110 , de sorte qu’ils puissent être accouplés, mutés et “croisés”.

Cela semble toutefois inutile pour le transport et le stockage. Quel est le moyen le plus simple de coder cela en tant que chaîne plus courte?

Je suppose que c’est assez sortingvial, mais je ne sais pas par où commencer.

Mise à jour: il me faut en réalité une autre chaîne: l’une des demandes de transport sera une demande GET.

Le plus simple serait de prendre chaque chiffre et de le traiter comme un peu. Chaque groupe de 8 bits peut être stocké dans un octet. Ensuite, vous pouvez l’envoyer sous forme de stream d’octets. Vous devrez également stocker la longueur de la chaîne d’origine afin de pouvoir distinguer “0” de “00”.

Voici un moyen d’écrire la conversion de chaîne en un tableau d’octets:

 byte[] convertToBytes(ssortingng s) { byte[] result = new byte[(s.Length + 7) / 8]; int i = 0; int j = 0; foreach (char c in s) { result[i] <<= 1; if (c == '1') result[i] |= 1; j++; if (j == 8) { i++; j = 0; } } return result; } 

Inverser l'opération est très similaire.

Si vous devez transmettre les données sous forme de chaîne, vous pouvez coder en 64 base le tableau d'octets obtenu.

Vous voudrez peut-être aussi garder cette forme en mémoire. Cela sera beaucoup plus efficace que de le stocker sous forme de chaîne dans laquelle chaque chiffre est stocké sous forme de caractère à 2 octets. Vous utilisez environ 16 fois plus de mémoire que nécessaire pour stocker vos données. L'inconvénient est qu'il est légèrement plus difficile à utiliser sous cette forme, donc si vous avez assez de mémoire, ce que vous faites actuellement pourrait bien fonctionner.

Qu’en est-il de la convertir en son équivalent entier en base 10?

 int myBin = Convert.ToInt32("01001010110", 2); 

Documentation Convert.ToInt32 ()

Je voudrais juste les stocker sous forme de tableau d’octets et utiliser une fonction d’assistance pour traduire entre la version tableau d’octets et la version chaîne.

Ou implémenter un codage de longueur d’exécution ou de Huffman . Les deux sont assez faciles à mettre en œuvre. Le RLE est de loin le plus simple, mais aura dans la plupart des cas un taux de compression plus bas. Si vos données comportent généralement plusieurs caractères consécutifs de la même valeur, cela pourrait néanmoins apporter une amélioration substantielle.

La réponse d’Abe Miessler est bonne, mais avec l’avertissement mentionné dans les commentaires.

Si 64 bits ne suffisent pas pour représenter votre chaîne, envisagez d’utiliser une classe BigInt http://www.codeproject.com/KB/cs/BigInt.aspx (vous voudrez probablement append des méthodes d’extension to/fromBinary() Vous pouvez également représenter ceci sous la forme d’une … liste d’octets liée.

L’une ou l’autre approche pose le problème de la suppression des zéros non significatifs, vous voudrez donc également stocker la longueur originale.