Parser de binaire, Signed 64-bit integer [Résolu]

Signaler
Messages postés
381
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
23 octobre 2014
-
Messages postés
381
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
23 octobre 2014
-
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

Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
3
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

--
Messages postés
381
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
23 octobre 2014

Merci pour la réponse !
Messages postés
32951
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 juin 2021
351
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



Messages postés
381
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
23 octobre 2014

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
Messages postés
381
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
23 octobre 2014

PS :

Les fonctions gmp_* ne sont pas disponibles par défaut partout.
Messages postés
381
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
23 octobre 2014

PPS :

Depuis la version 5.6.3 :

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