2010-08-28 17 views
0

J'ai des données binaires avec un mélange de chaînes terminées uint32 et null. Je connais la taille d'un ensemble de données individuel (chaque ensemble de données partage le même format), mais pas le format réel.Déterminer le format de données inconnu des données binaires dans PHP

Je l'ai utilisé Déballez pour lire les données avec les fonctions suivantes:

function read_uint32($fh){ 
    $return_value = fread($fh, 4); 
    $return_value = unpack('L', $return_value); 
    return $return_value[1]; 
} 

function read_string($fh){ 
    do{ 
    $char = fread($fh, 1); 
    $return_string .= $char; 
    }while(ord($char) != 0); 
    return substr($return_string, 0, -1); 
} 

puis essayer essentiellement deux fonctions et de voir si les données sens comme une chaîne, et sinon il est probablement un int , y a-t-il un moyen plus facile de faire cela?

Merci.

Répondre

1

bien je pense que votre approcah est correct. bien si vous obtenez seulement des chaînes ascii c'est assez facile car le plus gros bit sera toujours 0 ou 1 (dans certains cas étranges ...) analyser quelques octets du fichier et ensuite regarder la distribution vous dira probablement si son ascii ou quelque chose de binaire. si vous avez un encodage différent comme utf8 ou quelque chose, c'est vraiment une douleur dans le cul. vous pouvez probablement rechercher des caractères récurrents CR/LF ou filtrer le raing 0-31 pour ne laisser glisser que les onglets, cr, lf, ff. lorsque vous analysez les X premiers octets et comparez le ratio des caractères non tab, cr, lf, ff et autres. cela fonctionnera pour n'importe quel encodage puisque la gamme ascii est normée ... pour définir le type de fichier réel il est probablement préférable de le laisser dans la couche os et d'appeler simplement le fichier depuis le shell ou utiliser les fonctions php pour obtenir le type MIME ...