2010-07-15 4 views
0

J'ai des données binaires qui ont un fichier "map" correspondant qui identifie chaque point de données dans les données binaires en fournissant un décalage et une longueur de bit. Donc, je pourrais avoir les applications suivantes:PHP: Lit un nombre arbitraire de bits à partir d'une position de décalage arbitraire dans les données binaires

$paths = array ("path1" => array ("offset" => 224, "size" => 2), 
       "path2" => array ("offset" => 226, "size" => 6), 
); 

En réalité j'ai des dizaines de milliers de ces chemins pour les correspondances offset/taille. Maintenant, étant donné un chemin que je veux être en mesure de chercher le décalage approprié et lire le nombre de bits comme indiqué par la taille. Dans ce cas simple, path1 et path2 représentent un seul octet où path1 est les 2 premiers bits et path2 les 6 derniers bits.

Je l'ai déjà écrit cela en Python et je portage maintenant sur le code PHP pour des raisons que je ne vais pas aller dans :)

Quoi qu'il en soit, pour les tailles entières d'octets à entiers décalages d'octets que je peux utiliser déballer avec la chaîne de format appropriée. Ce qui me pose un problème, c'est comment gérer ces ensembles de bits «étrangement». La seule façon que j'ai imaginée jusqu'ici serait de trouver le décalage de bit le plus proche où le module de décalage 8 donne 0 (octet entier) et est inférieur au décalage donné, puis trouver la plus petite taille (toujours dans les tailles entières).) à partir de ce nouveau décalage qui englobe tous les bits requis, puis utilisez un bit & pour masquer les bits que je veux.

En Python, je pouvais simplement utiliser le module bitbuffer qui me permettait de chercher un décalage de bit, puis de lire n'importe quel nombre de bits que je voulais. Quelque chose comme ça dans le monde PHP?

Merci.

Répondre

0

Votre solution consistant à saisir les octets entiers, puis à utiliser un masque de bits, semble être la meilleure façon de le faire. Ensuite, je suppose que vous feriez aussi un bon décalage étant donné que les bits qui vous intéressent ne se sont peut-être pas terminés sur une limite d'octets.

Ce sera une manière lente de le faire mais je ne connais aucune fonction PHP interne qui peut faire ce genre de chose.

+0

C'est la réponse que j'avais ** peur ** de. – sberry

+0

J'imagine faire quelque chose comme (0xffff << (32- $ leftoffset)) | (0xffff >> (32- $ rightoffset)) pour créer le bitmask - ooh notez que sur PHP 64 bits vos ints seront 64 bits, donc peut-être avoir à modifier ce qui précède. Notez que faire n'importe quel traitement binaire en PHP va être lent s'il n'y a pas de fonction de bibliothèque, et je suis sûr à 99% qu'il n'y en a pas (il y a une petite chance qu'il y en ait un et je ne le sache pas) . – thomasrutter

Questions connexes