CRC32 avec Zlib et Boost

Dans un article précédent, j’avais montré comment calculer un CRC32 avec Indy. Maintenant, dans celui-ci, je vais vous montrer comment effectuer le même travail avec Zlib et Boost qui sont aussi inclus avec C++Builder.

Tout d’abord, il faut ajouter les fichiers d’en-têtes:

#include <System.Zlib.hpp>
#include <boost/crc.hpp>

Pour la méthode qui utilise Zlib:

String __fastcall TForm1::GetCRC32Zlib(const String AFileName)
{
    String Result;
 
    System::Classes::TMemoryStream* LMemoryStream = NULL;
    try
    {
        LMemoryStream = new System::Classes::TMemoryStream();
        LMemoryStream->LoadFromFile(AFileName);
        const unsigned __int64 LVal = System::Zlib::crc32(0,
            static_cast<System::Byte*>(LMemoryStream->Memory),
            LMemoryStream->Size);
        Result = System::Sysutils::IntToHex(LVal, 8);
    }
    __finally
    {
        delete LMemoryStream;
    }
 
    return Result;
}

Pour la méthode qui utilise Boost:

String __fastcall TForm1::GetCRC32Boost(const String AFileName)
{
    String Result;
 
    System::Classes::TMemoryStream* LMemoryStream = NULL;
    try
    {
        LMemoryStream = new System::Classes::TMemoryStream();
        LMemoryStream->LoadFromFile(AFileName);
        boost::crc_32_type crc_ccitt;
        crc_ccitt.process_bytes(
            static_cast<System::Byte*>(LMemoryStream->Memory),
            LMemoryStream->Size);
        const unsigned __int64 LVal = crc_ccitt.checksum();
        Result = System::Sysutils::IntToHex(LVal, 8);
    }
    __finally
    {
        delete LMemoryStream;
    }
 
    return Result;
}

Voilà, vous avez maintenant le choix entre plusieurs méthodes pour la prochaine fois où vous aurez à utiliser un contrôle de redondance cyclique sur un fichier.