2010-07-15 6 views
0

Certains langages de programmation prennent en charge les chaînes, qui sont stockées comme suit: Stocker des données binaires dans des chaînes - idéologiquement faux?

Par exemple, AnsiString type dans Delphi. Ces chaînes sont commodément gérées et on peut penser que c'est une bonne idée de les utiliser comme un conteneur pour les données binaires car il y a des opérations efficaces sur la concaténation, l'extraction de sous-chaîne, etc

D'une certaine manière, j'ai un fort sentiment, que l'utilisation du type de chaîne, même si elle est binaire sûre, pour stocker des données binaires est idéologiquement fausse, mais je ne trouve pas d'arguments solides pour défendre cette position. Bien sûr, dans des langages tels que PHP où l'utilisation de tableaux ajoute trop de surcharge (chaque membre du tableau en PHP occupe environ 50 octets de mémoire en raison de la nature hachée des tableaux), vous n'avez pas d'autre choix que d'utiliser des chaînes binaires conteneurs de données. Mais comme pour Delphi ou C++ (avec std :: string) je pense que stocker des données binaires dans des chaînes (par exemple, des clés de chiffrement de chiffrement ou n'importe quel tampon de protocole binaire) est faux si même vous avez la possibilité technique de le faire.

Qu'en pensez-vous? Y at-il des arguments contre le stockage des données binaires dans les chaînes?

+0

On pourrait argumenter qu'en C, toutes les chaînes ne sont que des données binaires, et les "chaînes" de données binaires sont assez courantes. Mais encore une fois, les chaînes C sont juste un cas particulier de tableaux d'octets. –

+0

Oui, vous avez raison. Mais je ne parle pas de C ici. Ah ... En pratique, tout n'est que mémoire, vous savez;)) Aucun type là-bas;) :) –

+0

Désolé pour écrire sur une vieille question, mais, si j'ai une chaîne "001" et je veux l'enregistrer dans un fichier binaire ou un fichier .dat, comment puis-je simplement sortir la chaîne en 3 bits au lieu de la représentation binaire de la chaîne? –

Répondre

2

Les chaînes sont conçues pour gérer du texte et non des données binaires. En tant que telles, certaines implémentations de chaînes peuvent prendre certaines libertés et ne pas stocker les données telles que vous les avez entrées (conversions Unicode, par exemple).

EDIT: Pour clarifier les choses, le commentaire ci-dessus, je ne parlais pas de toute langue spécifique, mais le fait que certaines implémentations de chaîne (dans les langues où les chaînes sont pas simplement des tableaux CHAR) stocker en interne les données différemment, donc même si vous créez la chaîne à partir d'un tableau d'octets, en interne, il pourrait être sauvegardé en tant que tableau à deux octets. En outre, dans beaucoup de langues, les chaînes sont immuables, ce qui n'est généralement pas ce que vous voulez quand vous traitez des données brutes.

Dans tous les cas, je ne peux pas penser à un langage qui a des implémentations de chaînes décentes mais pas à une implémentation vectorielle. Pourquoi ne pas utiliser cela comme votre conteneur? Il est vrai que la plupart des langages ne vous permettent pas de remplacer les opérateurs pour les tableaux/vecteurs, et pour cause (mais c'est une toute autre discussion). Mais à part ça, vous devriez avoir tout ce dont vous avez besoin, même si c'est avec un peu moins de sucre syntaxique.

+0

Python 2.x a une implémentation de chaîne correcte, mais il n'a pas de type séparé pour les chaînes d'octets de longueur arbitraire, et donc le type 'str' est souvent utilisé pour les deux (même si les chaînes de texte devraient probablement être de type unicode) . Tant que vous n'essayez pas de convertir vos données en Unicode, vous êtes en sécurité. Je suis assez sûr que Perl a une sémantique similaire, mais je ne me souviens pas du haut de ma tête. –

+0

par exemple, Delphi a des tableaux (vectoriels et multidimensionnels). Mais il n'y a pas de surcharge de l'opérateur, donc vous ne pouvez pas écrire ArrBig = Arr1 + Arr2 par exemple. Beaucoup de programmeurs que je connais préfèrent les chaînes binaires sur les tableaux mais je ne connais pas la liste complète des raisons. BTW –

+0

+1 pour "sucre syntaxique" – MrJD

1

Dépend de la langue. Si cela vous permet de faire tout ce que vous pouvez avec une chaîne comme, par exemple, avec un entier, pourquoi ne pas le stocker dans un int? autrement, pour la concaténation et pour toute autre utilité, cela peut sembler et se tromper, mais les cordes pourraient être la seule option.

Questions connexes