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

inwebo 381 Messages postés lundi 12 novembre 2007Date d'inscription 23 octobre 2014 Dernière intervention - 12 oct. 2014 à 14:42 - Dernière réponse : inwebo 381 Messages postés lundi 12 novembre 2007Date d'inscription 23 octobre 2014 Dernière intervention
- 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

6 réponses

Meilleure réponse
tpoinsot 345 Messages postés mardi 1 juin 2004Date d'inscription 17 octobre 2014 Dernière intervention - 14 oct. 2014 à 09:14
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

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

inwebo 381 Messages postés lundi 12 novembre 2007Date d'inscription 23 octobre 2014 Dernière intervention - 14 oct. 2014 à 10:19
Merci pour la réponse !
Commenter la réponse de tpoinsot
jordane45 22872 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 17 octobre 2018 Dernière intervention - 12 oct. 2014 à 18:41
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
inwebo 381 Messages postés lundi 12 novembre 2007Date d'inscription 23 octobre 2014 Dernière intervention - 12 oct. 2014 à 19:41
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 381 Messages postés lundi 12 novembre 2007Date d'inscription 23 octobre 2014 Dernière intervention - 14 oct. 2014 à 10:33
PS :

Les fonctions gmp_* ne sont pas disponibles par défaut partout.
inwebo 381 Messages postés lundi 12 novembre 2007Date d'inscription 23 octobre 2014 Dernière intervention - 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.
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.