en Perl, est-il approprié d'utiliser une chaîne sous forme de tableau d'octets contenant des données 8 bits? Toute la documentation que je peux trouver sur ce sujet se concentre sur des chaînes de 7 bits.
Par exemple, si je lis des données d'un fichier binaire dans Et je veux obtenir le premier octet, est Je viens d'un arrière-plan C principalement et je suis habitué à adopter un pointeur $ données code> p>
substr ($ données, 1,1) code> approprié? (Encore une fois, en supposant que ce soit des données de 8 bits) p>
char code> sur un
Lire () code> fonction. Mon problème pourrait être que je ne comprends pas quelle est la représentation sous-jacente d'une chaîne dans Perl. P> p>
6 Réponses :
Vous voulez probablement utiliser SYSOPEN et SYSRead Si vous souhaitez lire des octets à partir de fichier binaire.
Voir aussi perlopentut . p>
si cela est approprié ou nécessaire dépend de ce que vous essayez exactement de faire. < / p> sortie: p>
La documentation groupée pour la commande tentative de lecture de longueur Un décalage peut être spécifié pour placer les données de lecture à un endroit
dans la corde autre que le début. Un décalage négatif
Spécifie le placement à ce nombre de caractères comptant à l'envers
à partir de la fin de la chaîne. Un décalage positif supérieur à la
Longueur du scalaire Résultats dans la chaîne étant rembourrée au
taille requise avec des octets "\ 0" avant le résultat de la lecture
annexé. p>
L'appel est réellement mis en œuvre en termes de Perl ou de
Fread de System () Appelez. Pour obtenir un véritable appel (2) appel système, voir
"SysRead". P>
Notez les caractères lisez code>, reproduit ici, fournit de nombreuses informations pertinentes pour votre question. p>
lecture de fichiersHandle, scalaire, longueur, décalage code> p>
lecture de fichiersHandle, scalaire, longueur code> p>
Ma nature étant très pédant, quand je lisais ceci dans la documentation que j'ai trouvée caractère code> ambigu. Je n'étais pas clair si cela signifie une unité de données (c.-à-d. Un octet) ou une unité d'une chaîne (dépendante du codage)
Appeler fichier binmode, ": brut" code> ou
fichier binmod, ": octets" code> ouvrira toujours votre geste de fichier dans "octets", quelle que soit votre couche IO par défaut (disons, Si vous avez déclaré
utiliser utf8 code>).
En fait, je suis d'accord que l'utilisation de "personnages" se lit comme un bug pour moi, en particulier à la manière dont l'attention est portée à la distinction entre les caractères, les octets et les octets dans Encode (3perl) code>. Il s'agit d'être le bon mot, mais je pense que je l'aimerais si cela indique "des caractères (tels que définis par la couche d'E / S actuelle)". Je suppose que c'est aussi une critique de votre réponse, dans la mesure où
lue code> lit toujours "caractères" - mais parfois "caractère" est défini comme "octet" et parfois comme "point de code UTF-8".
voir PACLAC -F Pack et Perldoc -f Déballez pour traiter des chaînes en tant que réseaux d'octets. P>
Cela pourrait aider davantage si vous nous dites ce que vous essayez de faire avec le tableau d'octets. Il existe différentes façons de travailler avec des données binaires et chacun se prête à un ensemble d'outils différents. p>
Voulez-vous convertir les données en une matrice PERL? Si oui, Voulez-vous accéder aux éléments individuels de la chaîne sans le déballer? Si tel est le cas, Voulez-vous scanner la chaîne et convertir certains octets vers d'autres octets? Ensuite, le pack code> et
Déballez code> sont un bon début.
Split code> pourrait également être utile. P>
substr code> est rapide et fera le truc sur 8 données d'octets. Si vous voulez d'autres profondeurs de bits, jetez un coup d'œil à la fonction
VEC code>, qui marchait une chaîne sous forme de vecteur de bit. P>
s /// code> ou
tr /// code> peut être utile. P>
Permettez-moi simplement de poster un petit exemple sur le traitement de la chaîne comme une matrice binaire - car j'ai moi-même trouvé difficile de croire que quelque chose appelé "substr" traiterait des octets nuls; Mais semble-t-il, ci-dessous est un extrait d'une session de terminal de débogueur Perl (avec des approches de chaîne et de tableau / liste):
Les chaînes sont des chaînes de "caractères", qui sont plus grandes qu'un octet. 1 Vous pouvez stocker des octets En eux et les manipuler comme si elles sont des personnages, prenant lorsque vous essayez de lire et Écrivez des fichiers, le fait que vos personnages puissent ne pas mapper les octets devient important et intéressant. Ne pas mentionner ennuyeux. Cette gêne est en fait faite un peu pire par Perl essayant de faire ce que vous voulez dans le cas commun: si tous les caractères de la chaîne entrent dans un octet et que vous vous trouviez sur un système d'exploitation non Windows, vous n'avez pas réellement faire quelque chose de spécial pour lire et écrire des octets. Cependant, Perl se plaint si vous avez stocké un personnage de taille non octets et tentera de l'écrire sans lui donner un indice sur ce qu'il faut faire avec cela. P> Ceci est un peu lointain de loin, largement Parce que le codage est un sujet important et déroutant. Laissez-moi le laisser là-bas avec quelques références: regardez Encode (3perl) , ouvert (3perl) , Perldoc Open et Perldoc BinMode pour beaucoup de hilarants et de gory Détails. P> La réponse résumée est donc "Oui, vous pouvez traiter des chaînes comme si elles contiennent des octets si elles contiennent en fait des octets, que vous pouvez assurer uniquement en lecture et en écriture d'octets.". P > 1 : ou pédaniquement, "qui peut exprimer une plus grande gamme de valeurs qu'un octet, bien que Ils sont stockés comme des octets quand cela est pratique ". Je pense. P> 2 : Pour l'enregistrement, les chaînes de Perl sont représentées en interne par Une structure de données appelée «PV» qui, en plus d'un pointeur de caractères, sait que la longueur de la chaîne et la valeur actuelle de 3 : Eh bien, il commencera à stocker la valeur actuelle de substr code> S d'eux et ainsi de suite, et aussi longtemps que vous manipulez simplement des entités en mémoire, tout est assez pêchy. Le stockage des données est étrange, mais c'est surtout votre problème. 2
POS code>. 3 p>
POS code> s'il commence à être intéressant. Voir aussi P>
use Devel::Peek;
my $x = "bluh bluh bluh bluh";
Dump($x);
$x =~ /bluh/mg;
Dump($x);
$x =~ /bluh/mg;
Dump($x);