Parser de binaire, Signed 64-bit integer

Résolu
inwebo Messages postés 380 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 23 octobre 2014 - 12 oct. 2014 à 14:42
inwebo Messages postés 380 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 23 octobre 2014 - 17 oct. 2014 à 11:46
Bonjour,

je travail actuellement sur une classe de manipulation de fichier ico, pour se faire je parse ces fichiers grâce à la documentation glanée sur le web. ICO, File format, Bitmap info header.

Or pour ce header, je me retrouve à parser une chaine de 40 bytes. J'arrive à extraire le membre size qui est un DWORD. Par contre ma question est comment peut on en PHP parser un LONG qui est un Signed 64-bit integer qui n'est pas un type reconnus par PHP il me semble ?

- Je confirme que la chaine d'entrée est valide et dans le format attendus.
- All values in ICO/CUR files are represented in little-endian byte order.

Pseudo code :
$bin = "chaine binaire entrée"#40 bytes
$size = unpack( 'V', fread($f, 4) ) [1]; #DWORD
$width = unpack(); #Long ??? Mon problème


Voilà mon problème ! Parser un entier signé de 64-bits en php.

Si vous voulez plus d'informations n'hésitez pas.

Bonne journée à tous
________________________________________
( $toBe || !$toBe ) = $this->Question();

3 réponses

tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
14 oct. 2014 à 09:14
bonjour,
tu peux faire le unpack à la main ou chercher sur google. Par exemple :
http://stackoverflow.com/questions/9908743/converting-hex-to-int64-in-php

--
1
inwebo Messages postés 380 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 23 octobre 2014
14 oct. 2014 à 10:19
Merci pour la réponse !
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
12 oct. 2014 à 18:41
Bonjour,
Voici les types de valeurs acceptées dans la fonction pack() et unpack()
http://php.net/manual/fr/function.pack.php

Caractères de formatage pour pack()
Code Description
a NUL - Une chaîne complétée avec NULL
A SPACE - Une chaîne complétée avec un espace
h Chaîne hexadécimale h, bit de poids faible en premier
H Chaîne hexadécimale H, bit de poids fort en premier
c Caractère signé
C Caractère non signé
s entier court signé (toujours sur 16 bits, ordre des bits dépendant de la machine)
S entier court non signé (toujours 16 bits, ordre des bits dépendant de la machine)
n entier court non signé (toujours 16 bits, ordre des bits big endian)
v entier court non signé (toujours 16 bits, ordre des bits little endian)
i entier signé (taille et ordre des bits dépendants de la machine)
I entier non signé (taille et ordre des bits dépendants de la machine)
l entier long signé (toujours 32 bits, ordre des bits dépendant de la machine)
L entier long non signé (toujours 32 bits, ordre des bits dépendant de la machine)
N entier long non signé (toujours 32 bits, ordre des bits big endian)
V entier long non signé (toujours 32 bits, ordre des bits little endian)
f nombre à virgule flottante (taille et représentation dépendantes de la machine)
d nombre à virgule flottante double (taille et représentation dépendantes de la machine)
x caractère NUL
X Recule d'un caractère
Z Chaîne complétée par la valeur NULL (nouveau en PHP 5.5)
@ Remplit avec des NUL jusqu'à la position absolue



Pour ce qui est de :

un LONG qui est un Signed 64-bit integer qui n'est pas un type reconnus par PHP il me semble ?

Il me semble que cela dépend de ta config (matériel/OS et version de PHP installée..)
Tu peux vérifier avec :
echo PHP_INT_MAX;


Tu peux aussi jeter un oeil à ceci :
http://php.net/manual/fr/language.types.integer.php



0
inwebo Messages postés 380 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 23 octobre 2014
12 oct. 2014 à 19:41
Merci Jordane45

Il manquait des informations c'est vrai. Ma plate forme Debian 64bits, PHP compilé comme il faut, est valide 64bits.

echo PHP_INT_MAX;

// retourne
// 9223372036854775807 valeur maximale d'un entier.


Tout est valide de ce côté.

Par contre c'est bien la fonction unpack() qui me pose problème car $format ne propose justement pas d'entier signé 64-bits !

Par contre à voir du côté des fonctions gmp_*.

Merci
0
inwebo Messages postés 380 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 23 octobre 2014
14 oct. 2014 à 10:33
PS :

Les fonctions gmp_* ne sont pas disponibles par défaut partout.
0
inwebo Messages postés 380 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 23 octobre 2014
17 oct. 2014 à 11:46
PPS :

Depuis la version 5.6.3 :

The "q", "Q", "J" and "P" codes were added to enable working with 64-bit numbers.
0
Rejoignez-nous