2015-05-25 15 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

相关问题