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

Messages postés
381
Date d'inscription
lundi 12 novembre 2007
Dernière intervention
23 octobre 2014
- - Dernière réponse : inwebo
Messages postés
381
Date d'inscription
lundi 12 novembre 2007
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();
Afficher la suite 

Votre réponse

3 réponses

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

--

Merci tpoinsot 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

inwebo
Messages postés
381
Date d'inscription
lundi 12 novembre 2007
Dernière intervention
23 octobre 2014
-
Merci pour la réponse !
Commenter la réponse de tpoinsot
Messages postés
23551
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
9 décembre 2018
0
Merci
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



Commenter la réponse de jordane45
Messages postés
381
Date d'inscription
lundi 12 novembre 2007
Dernière intervention
23 octobre 2014
0
Merci
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
inwebo
Messages postés
381
Date d'inscription
lundi 12 novembre 2007
Dernière intervention
23 octobre 2014
-
PS :

Les fonctions gmp_* ne sont pas disponibles par défaut partout.
inwebo
Messages postés
381
Date d'inscription
lundi 12 novembre 2007
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.
Commenter la réponse de inwebo

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.