目前分類:C++ (22)

瀏覽方式: 標題列表 簡短摘要

今天用 C++ 呼叫 openssl 來計算一個檔案的 SHA1 值,

簡單用這篇記錄一下寫完的函式吧:

#include <openssl/sha.h>

std::string CalcFileSHA1(const char* pFilePath)
{
    std::string sResult = "";

    if (pFilePath != NULL && *pFilePath != '\0')
    {
        FILE* pf = fopen(pFilePath, "rb");
        if (pf)
        {
            // Initialize sha1 context
            SHA_CTX ctx = {};
            int nRet = SHA1_Init(&ctx);
            if (nRet == SHA_FUNC_RET_SUCCESS)
            {
                char buffer[2048] = {};
                size_t nBytesRead = 0;
                while (!feof(pf))
                {
                    // Read some bytes
                    nBytesRead = fread(buffer, 1, sizeof(buffer), pf);
                    if (nBytesRead == 0)
                    {
                        break;
                    }

                    // Update bytes into sha1 context
                    if ((nRet = SHA1_Update(&ctx, buffer, nBytesRead)) != SHA_FUNC_RET_SUCCESS)
                    {
                        printf("Failed to update sha1 context while calculating sha1 of [%s]: nRet=%d\n", pFilePath, nRet);
                        break;
                    }
                }

                if (nRet == SHA_FUNC_RET_SUCCESS)
                {
                    // Finalize sha1 calculation
                    if ((nRet = SHA1_Final(reinterpret_cast<unsigned char*>(buffer), &ctx)) == SHA_FUNC_RET_SUCCESS)
                    {
                        snprintf(buffer+SHA_DIGEST_LENGTH, sizeof(buffer)-SHA_DIGEST_LENGTH, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
                                static_cast<unsigned char>(buffer[0]),
                                static_cast<unsigned char>(buffer[1]),
                                static_cast<unsigned char>(buffer[2]),
                                static_cast<unsigned char>(buffer[3]),
                                static_cast<unsigned char>(buffer[4]),
                                static_cast<unsigned char>(buffer[5]),
                                static_cast<unsigned char>(buffer[6]),
                                static_cast<unsigned char>(buffer[7]),
                                static_cast<unsigned char>(buffer[8]),
                                static_cast<unsigned char>(buffer[9]),
                                static_cast<unsigned char>(buffer[10]),
                                static_cast<unsigned char>(buffer[11]),
                                static_cast<unsigned char>(buffer[12]),
                                static_cast<unsigned char>(buffer[13]),
                                static_cast<unsigned char>(buffer[14]),
                                static_cast<unsigned char>(buffer[15]),
                                static_cast<unsigned char>(buffer[16]),
                                static_cast<unsigned char>(buffer[17]),
                                static_cast<unsigned char>(buffer[18]),
                                static_cast<unsigned char>(buffer[19]));
                        sResult = buffer+SHA_DIGEST_LENGTH;
                    }
                    else
                    {
                        printf("Failed to finalize sha1 context while calculating sha1 of [%s]: nRet=%d\n", pFilePath, nRet);
                    }
                }
            }
            else
            {
                printf("Failed to init sha1 context while calculating sha1 of [%s]: nRet=%d\n", pFilePath, nRet);
            }

            // Close file handle
            fclose(pf);
        }
        else
        {
            printf("Failed to open [%s] to calculate sha1!\n", pFilePath);
        }
    }
    else
    {
        printf("Invalid parameter for CalcFileSHA1: file path cannot be empty!\n");
    }

    return sResult;
}
文章標籤

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

前一陣子幫專案用 make -j 的方式,執行平行編譯,加快編譯的速度,

不過最近在加上 Google Protocol Buffer 的編譯之後,

卻發現常常在編譯到 Google Protocol Buffer 時,編譯速度突然變得非常的慢,

文章標籤

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

今天在追一個專案的問題,想說在原本的 C++ 程式裡,

把同事寫的另一個 shared library (DLL) 也加進來,

原本應該要用動態連結 (dynamic link) 的,但有點懶,就直接用靜態連結 (static link),

文章標籤

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

今天在寫一個測試程式,要尋訪特定目錄下所有的子目錄與檔案,

在 Linux 下要實現這個程式,就是要用到 opendir, readdir, 和 closedir 這幾個函式,

簡單寫個測試程式吧~

文章標籤

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

今天在跑 unit-testing 程式時,發現在跑到某個 test case 時會一直出錯,

但是如果每次都跑全部的 test case 又頗浪費時間,

於是來找找看 Google Test 如何選擇性的執行某些特定的 test case...

文章標籤

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

最近在查一個 C++ 程式莫名其妙會當掉的問題...

蠻難查的,因為通常是跑了幾個小時後才會出現,

但如果拿 core dump 出現當時的資料重新跑一次,就好好的什麼事都沒發生...

文章標籤

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

最近在查一個 C++ 程式當掉的問題,懷疑是多執行緒 (multi-thread) 造成的,

因此在 Google Test 的 unit-testing 程式裡,加了下面的程式碼:

TEST(MyLib, ScanMultiThread)
{
    // Initialize and set thread joinable
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

    pthread_t threadData;
    std::vector<pthread_t> vecThreads;
    int rc = 0;

    // Create threads
    for (unsigned int i = 0; i < 1000; i++)
    {
        rc = pthread_create(&threadData, NULL, ThreadFuncScan, (void*)i);
        if (rc == 0)
        {
            printf("Created worker thread %d\n", i+1);
            vecThreads.push_back(threadData);
        }
        else
        {
            printf("Failed to create worker thread");
        }
    }

    // Free attribute and wait for the other threads
    pthread_attr_destroy(&attr);
    void* pThreadStatus = NULL;
    for (std::vector<pthread_t>::const_iterator it = vecThreads.begin(); it != vecThreads.end(); ++it)
    {
        rc = pthread_join(*it, &pThreadStatus);
        if (rc != 0)
        {
            printf("Failed to join thread: rc=%d\n", rc);
        }
    }
}
文章標籤

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

今天想要在 C++ 程式裡用 printf() 印一個 size_t 的變數值,

結果 gcc 出現了編譯警告:

Test.cpp:113:76: warning: format '%d' expects argument of type 'int', but argument 2 has type 'size_t {aka long unsigned int}' [-Wformat=]
     printf("Thread %d is running\n", iThread);
文章標籤

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

最近在用 Google Test 寫 C++ 的 unit-testing 程式,

想當然爾會遇到一些要測試 protected/private function 的問題...

以前我都是會用一個新的 class 來繼承現有的 class,

文章標籤

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

今天在用 GoogleTest 寫 unit-testing 時,

因為有個初始化的動作很耗時,想說每次跑 unit-testing 時最好只跑一次,

而不是每個 test case 或 test 都跑...

文章標籤

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

今天在寫專案的一個 C++ 程式時,用 cppcheck 檢查出一個 memory leak 的問題,

不過自己檢查過應該是沒有問題,可能是程式邏輯複雜,

因此 cppcheck 沒辦法正確判斷記憶體是否有被釋放...

文章標籤

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

今天寫了一段 C 的程式,想要建立一個 STL map,

裡面每個不同的 mode 會有其對應的 bool 陣列,所以一開始寫得像這樣:

bool arrayMode0[] = { false }; 
bool arrayMode1[] = { false, true }; 
bool arrayMode2[] = { true, false }; 
bool arrayMode3[] = { true }; 
mapResult[0] = std::list<bool>(arrayMode0, arrayMode0+sizeof(arrayMode0)/sizeof(arrayMode0[0]));
mapResult[1] = std::list<bool>(arrayMode1, arrayMode1+sizeof(arrayMode1)/sizeof(arrayMode1[0]));
mapResult[2] = std::list<bool>(arrayMode2, arrayMode2+sizeof(arrayMode2)/sizeof(arrayMode2[0]));
mapResult[3] = std::list<bool>(arrayMode3, arrayMode3+sizeof(arrayMode3)/sizeof(arrayMode3[0]));
文章標籤

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

專案有用到一個叫 zlog 的模組,用來在 C 程式裡寫出 debug log 檔案~

今天接手了這個部分,發現它預設支援的 debug level 只有幾種,

像 DEBUG, INFO, NOTICE, WARN, ERROR, FATAL 等等,

文章標籤

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

今天在用 Google Test 寫一個 C++ class 的測試程式時,

遇到了要測試 protected function 的問題...

原本要被測試的 class 定義像是下面這樣:

文章標籤

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

在 Linux 上執行一個 C/C++ 的程式,要如何在程式裡面得知執行的路徑呢?

stackoverflow: how to find the location of the executable in C 這邊找到答案,

用 readlink("/proc/self/exe", buf, bufsize) 就行了~

文章標籤

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

我們的專案主要是用 python 寫的,

裡面用了 python 的 xmlrpclib 來作 process 間溝通的管道~

最近有個需求是要用 C++ 寫一個程式與 python 作 IPC,

文章標籤

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

最近學到了在 Linux 上寫程式時,可以寫出有顏色的字串,

基本上可以有一些標示重點的效果,

像是在一堆的 log 中,把比較重要的標示出來~

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

今天在工作上遇到了這個問題~

像是需要 #define XXX 在所有的 VC 專案裡,但是卻又不想要因此去修改所有的專案設定...

 

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

其實常常在專案 build 了一堆之後,才發現有一些失敗了,浪費了很多的時間。
在網路上找到這一篇文章,相當的有用,
可以在第一次 build fail 的時候就立刻取消,

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

這個 API 可以用來取得 MSI 裡面的 property。


ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()

1 2
找更多相關文章與討論