Salut à toutes et à tous,
J'utilise la fonction pack de PERL afin de créer un fichier binaire qui sera lu par la suite par un programme écrit en C. Le fichier binaire ne contient que des entiers SIGNES dont les valeurs ne dépassent pas les possibilités d'un codage en 32 bits.
Pour des raisons d'espace mémoire, mais aussi de portabilité, j'aimerais stocker chacun de ces entiers sur 4 octets. Or la fonction PERL pack(), via le format 'i' choisit le nombre d'octet en fonction du système utilisé. Ainsi, sur une machine x86_64, ce sera sur 8 octets. Ceci est pour le moins problématique puisque: 1. Ca prend deux fois plus de mémoire; 2. Le programme C tentera de lire les données 4 à 4 et les données récupérées seront alors biaisées.
D'un autre côté, il y a la possibilité d'utiliser les formats 'N' ou 'V'. Ces derniers permettent de stocker des données sur 32 bits (soit 4 octets), mais ils doivent être positifs! Or les entiers que je chercher à stocker sont signés.
D'où ma question: Quel moyen peut-on utiliser pour stocker des entiers signés sur 32 bits (4 octets) dans un fichier binaire avec la fonction pack() de PERL ?
Et la petite question bonus que j'insère ici même si elle est liée au C: Comment en C peut-on spécifier qu'on lit des données dont l'ordre est "little-endian" ou "big-endian" ?
Merci par avance pour toute information constructive,
Mickaël
Partager