J'ai réussi à analyser un gros fichier binaire (~ 8 Go) en lisant des blocs de données en mémoire et en inversant les entiers big-endian en utilisant les fonctions montrées ci-dessous. Cependant, j'essaie d'obtenir plus de performance en utilisant Boost Memory-Mapped files mais je ne suis pas capable d'utiliser les fonctions endian_swap parce que le fichier est ouvert en mode lecture seule. Existe-t-il un moyen efficace d'échanger les octets sans écrire le fichier d'origine? Si non, les performances seraient affectées par le surdébit d'E/S?Méthode efficace d'échange d'octets dans un fichier mappé en mémoire
inline void endian_swap(unsigned short int& x)
{
x = (x>>8) |
(x<<8);
}
inline void endian_swap(unsigned int& x)
{
x = (x>>24) |
((x<<8) & 0x00FF0000) |
((x>>8) & 0x0000FF00) |
(x<<24);
}
inline void endian_swap(unsigned long long int& x)
{
x = (((unsigned long long int)(x) << 56) | \
(((unsigned long long int)(x) << 40) & 0xff000000000000ULL) | \
(((unsigned long long int)(x) << 24) & 0xff0000000000ULL) | \
(((unsigned long long int)(x) << 8) & 0xff00000000ULL) | \
(((unsigned long long int)(x) >> 8) & 0xff000000ULL) | \
(((unsigned long long int)(x) >> 24) & 0xff0000ULL) | \
(((unsigned long long int)(x) >> 40) & 0xff00ULL) | \
((unsigned long long int)(x) >> 56));
}
Le code a été trouvé sur ce article. Je vous remercie beaucoup pour votre temps
Je n » Je réalise la fonction "drapeau openmode" parce que j'utilisais la version 1.42 alors que celle-ci était implémentée sur 1.44. Je vous remercie! – Emer
@Emer, aha! Ce sont les petits détails qui font toute la différence dans le monde .. quand je viens et regarde la source sur le site, il n'est pas du tout évident que c'est une nouvelle fonctionnalité. :) – sarnold