2015-05-25 16 views
0

我試圖創建一個文件,從一個指針採取二進制條目,但我遇到了一些轉換問題。如何使用二進制標準中的指針創建具有十六進制信息(如char)的文件?

我的功能就是一個:

pSec指向與我想寫的信息的第一個地址。

int StoreFile::setK(unsigned int Slot, void* pSec, unsigned int Len) { 
    int Ret = 0; 
    char tLen[sizeof(Len)]; 
    char cSec[Len*2], *Sec; 

    static char FName[fs_PathMaxLg]; 
    snprintf(FName, sizeof(FName)-1, "%s/Store.INI", _Dir); 

    static char Section[2][20]; 

    snprintf(Section[0], sizeof(Section[0])-1, "%lu_SIZE", Slot); 
    snprintf(Section[1], sizeof(Section[1])-1, "%lu_DATA", Slot); 

    do { 

在這裏,我嘗試檢查所有地址,傳遞信息到char*,但我想那會作爲一個十六進制(的char數組以十六進制的內容)這一信息,但我並沒有在成功傳遞來自指向char的地址的信息。

 BYTE *ptr = (BYTE*)pSec; 
     for (int i = 0; i != Len; i++) { 
      Sec = strdup((const char*)ptr[i]); 
      // snprintf(Sec, 2, "%2.2x", ptr[i]); 
      // cSec = (char*)pSec; 
      // pSec += 1; 
      Sec += 2; 
     } 

     snprintf(tLen, sizeof(Len), "%x", Len); 

這裏是另一個函數,它的字符數組寫入到文件,問題只是寫Sec時。

 Ret = WriteProfile(FName, "STOCK", Section[0], tLen); 
     if (Ret != 1) { 
      break; 
     } 
     Ret = WriteProfile(FName, "STOCK", Section[1], Sec); 
     if (Ret != 1) { 
      break; 
     } 
     Ret = 0; 
    } while(0); 

您有任何建議來改善此代碼嗎? 我嘗試了很多東西。

+0

如果皮秒不是零結尾的字符串,不要試圖在的strdup使用它。 – simon

回答

0

因此,核心部分是將二進制數據轉換爲十六進制表示。

由於一個字節轉換爲兩個十六進制數字,一個十六進制數字等於四個二進制位。所以你必須分別轉換一個字節的高4位和低4位。

假設你想從datan字節轉換成字符串s,你可以這樣做:

// convert lower 4 bit to hex 
char byte2hex(char byte) { 
    byte &= 0x0f; 
    if (byte >= 10) { 
     // a-f 
     return byte + 'a' - 10; 
    } else { 
     // 0-9 
     return byte + '0'; 
    } 
} 

string bin2hex(const char *data, int n) { 
    string s; 
    for (int i = 0; i < n; ++i) { 
     s.push_back(byte2hex(data[i]>>4)); 
     s.push_back(byte2hex(data[i])); 
    } 
    return s; 
} 
+0

Tnx,我有兩個問題:1)如何獲得一個地址的信息[數據]?我在掃描每個地址並分別轉換每個地址時是否正確?有沒有簡單的方法來做到這一點? 2)我知道一個字符串的定義是一個字符數組,但我可以使用相同的東西?因爲我不能改變其他函數的條目(so :: string s == char * s在函數調用中),或者我必須使用strcpy(例如)進行轉換? –

+0

1)你必須分別轉換每個字節。我使用數組來獲取每個字節的內容:'data [i]'。 2)在C中,一個字符串是一個以空字符結尾的字符數組。但在C++中,有一種叫做'string'的類型,它是'basic_string ',不是char數組。 – songziming

相關問題