2012-06-21 4 views
2

Salut tous donc j'ai rencontré un peu de problème, de PHP, je dois lire des données d'un fichier binaire où l'espace est de la plus haute importance, donc ils ont utilisé des entiers 24 bits dans les lieux .24bit int en php

Maintenant, pour la plupart des données que je peux lire Déballez emballer cependant/Déballez ne prend pas en charge 24 bits int de: s

Je pensais que je pourrais peut-être simplement lire les données (disons par exemple 000104) comme H * et l'ai lu dans un var qui serait correct.

// example binary data say I had the following 3 bytes in a binary file 
// 0x00, 0x01, 0x04 

$buffer = unpack("H*", $data); 

// this should equate to 260 in base 10 however unpacking as H* will not get 
// this value. 

// now we can't unpack as N as it requires 0x4 bytes of data and n being a 16 bit int 
// is too short. 

Quelqu'un a-t-il déjà dû faire face à cela? Des solutions? Conseil?

+0

est la vitesse très importante ou pouvez-vous vivre avec une solution simple, même si n'est pas le plus rapide? –

+6

Ne pourriez-vous pas juste le remplir avec un octet nul? Comme '$ buffer = unpack (" N "," \ x00 $ data ");' – DaveRandom

+0

Merci Dave qui semble avoir travaillé! <3 – Joe

Répondre

0

Si le fichier n'a que 3 octets comme ci-dessus, la méthode la plus simple est celle du remplissage comme @DaveRandom. Mais si c'est un fichier long, cette méthode devient inefficace.

Dans ce cas, vous pouvez lire chaque élément en tant que char et un court, après l'avoir reconditionné par les opérateurs au niveau du bit.

Ou vous pouvez lire 12 octets comme 3 longs, puis le diviser en 4 groupes de 3 octets avec des opérateurs bit à bit. Les octets restants seront extraits par les deux méthodes ci-dessus. Ce sera la solution la plus rapide sur de grandes données.

unsigned int i, j; 
unsigned int dataOut[SIZE]; 

for (i = 0, j = 0; j < size; i += 4, j += 3) 
{ 
    dataOut[i]  = dataIn[j] >> 8; 
    dataOut[i + 1] = ((dataIn[j] & 0xff) << 16) | (dataIn[j + 1] >> 16); 
    dataOut[i + 2] = ((dataIn[j + 1] & 0xffff) << 8) | (dataIn[j + 2] >> 24); 
    dataOut[i + 3] = dataIn[j + 2] & 0xffffff; 
} 

Ce qui suit question a un exemple de code pour décompresser une chaîne de 24/48bits trop