91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

蕉岭县| 红河县| 泽库县| 万荣县| 新乡县| 武汉市| 黄冈市| 榆树市| 长顺县| 呼伦贝尔市| 平安县| 札达县| 运城市| 博罗县| 那曲县| 肃宁县| 逊克县| 即墨市| 凉山| 灵璧县| 鹤山市| 谢通门县| 普定县| 小金县| 岳阳县| 青岛市| 唐海县| 太谷县| 南丹县| 康平县| 米林县| 营口市| 榆中县| 枝江市| 新巴尔虎左旗| 花莲市| 平阳县| 湟中县| 兴和县| 郴州市| 彭州市|