中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++解壓與文件完整性保護

發布時間:2024-10-30 14:28:49 來源:億速云 閱讀:80 作者:小樊 欄目:編程語言

在C++中,我們可以使用標準庫中的<fstream><iostream>頭文件來實現文件的解壓和完整性保護。以下是一個簡單的示例,展示了如何使用C++讀取一個壓縮文件(例如ZIP文件),并將其內容解壓縮到目標目錄。同時,我們還將使用哈希算法(如MD5)來確保文件的完整性。

首先,確保已經安裝了minizip庫,它是一個用于處理ZIP文件的C庫。在Windows上,可以使用vcpkg安裝:

vcpkg install minizip

接下來,創建一個名為unzip_and_verify.cpp的文件,并將以下代碼粘貼到其中:

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>
#include <iomanip>
#include <cstring>
#include <openssl/md5.h>
#include <minizip/unzip.h>

std::string md5_file(const std::string& file_path) {
    std::ifstream file(file_path, std::ios::binary);
    if (!file) {
        std::cerr << "Error opening file: " << file_path << std::endl;
        return "";
    }

    MD5_CTX md5Context;
    MD5_Init(&md5Context);

    const int buffer_size = 4096;
    std::vector<char> buffer(buffer_size);
    while (file.read(buffer.data(), buffer_size)) {
        MD5_Update(&md5Context, buffer.data(), file.gcount());
    }

    unsigned char digest[MD5_DIGEST_LENGTH];
    MD5_Final(digest, &md5Context);

    std::stringstream md5Hash;
    for (int i = 0; i < MD5_DIGEST_LENGTH; ++i) {
        md5Hash << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(digest[i]);
    }

    return md5Hash.str();
}

bool unzip_file(const std::string& zip_path, const std::string& dest_dir) {
    unzFile uf = unzOpen(zip_path.c_str());
    if (!uf) {
        std::cerr << "Error opening ZIP file: " << zip_path << std::endl;
        return false;
    }

    int ret = unzGoToFirstFile(uf);
    while (ret == UNZ_OK) {
        char filename[256];
        unzGetCurrentFileInfo(uf, nullptr, filename, sizeof(filename), nullptr, 0, nullptr, nullptr);

        std::string full_path = dest_dir + "/" + filename;
        std::ofstream outfile(full_path, std::ios::binary);
        if (!outfile) {
            std::cerr << "Error creating file: " << full_path << std::endl;
            unzClose(uf);
            return false;
        }

        char buffer[buffer_size];
        unzReadCurrentFile(uf, buffer, buffer_size);
        outfile.write(buffer, unzGetCurrentFileInfo(uf, nullptr, nullptr, 0, nullptr, 0, nullptr, nullptr));

        unzCloseCurrentFile(uf);
        ret = unzGoToNextFile(uf);
    }

    unzClose(uf);
    return true;
}

int main() {
    std::string zip_path = "example.zip"; // 替換為你的ZIP文件路徑
    std::string dest_dir = "output"; // 替換為你希望解壓縮到的目錄

    // 計算ZIP文件的MD5哈希值
    std::string md5_hash = md5_file(zip_path);
    std::cout << "ZIP file MD5 hash: " << md5_hash << std::endl;

    // 解壓縮文件到目標目錄
    if (unzip_file(zip_path, dest_dir)) {
        std::cout << "File unzipped successfully." << std::endl;
    } else {
        std::cerr << "Error unzipping file." << std::endl;
        return 1;
    }

    // 計算解壓縮后文件的MD5哈希值
    std::string解壓后_md5_hash = md5_file(dest_dir);
    std::cout << "Unzipped file MD5 hash: " <<解壓后_md5_hash << std::endl;

    if (md5_hash ==解壓后_md5_hash) {
        std::cout << "File integrity verified." << std::endl;
    } else {
        std::cerr << "File integrity check failed." << std::endl;
        return 1;
    }

    return 0;
}

在編譯時,需要鏈接minizip庫和OpenSSL庫。在Windows上,可以使用vcpkg生成編譯命令:

vcpkg build --target x64-windows --config Release

在Linux或macOS上,可以使用以下命令:

g++ -o unzip_and_verify unzip_and_verify.cpp -lminizip -lssl -lcrypto

運行生成的可執行文件unzip_and_verify.exe(Windows)或./unzip_and_verify(Linux/macOS),它將解壓縮指定的ZIP文件并將其內容保存到目標目錄。同時,它還會計算ZIP文件和解壓縮后文件的MD5哈希值,以確保文件的完整性。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

宁城县| 资兴市| 汤阴县| 九龙县| 伊宁市| 金平| 巨鹿县| 三江| 江安县| 四川省| 德令哈市| 富源县| 洞头县| 西和县| 商河县| 株洲县| 子洲县| 游戏| 东明县| 宜良县| 墨脱县| 连南| 通海县| 南木林县| 石嘴山市| 新竹县| 鸡东县| 岫岩| 犍为县| 岑溪市| 桐柏县| 专栏| 双桥区| 铜鼓县| 金昌市| 屏边| 山东省| 江阴市| 乌什县| 天长市| 芒康县|