2015-05-25 6 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 бита и минимум 4 бит байта соответственно.

Предположим, что вы хотите конвертировать n байт из data в строку 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, у меня есть 2 вопроса: 1) Как я могу получить информацию [данные] по одному адресу? Правильно ли я просматриваю каждый адрес и конвертирует каждый отдельно? Нет простого способа сделать это? 2) Я знаю, что определение строки - это массив символов, но я могу использовать то же самое? Поскольку я не могу изменить запись другой функции (так: string s == char * s в вызове функции), или мне нужно преобразовать с помощью strcpy (например)? –

+0

1) Вам необходимо преобразовать каждый байт отдельно. Я использую массив для получения содержимого каждого байта: 'data [i]'. 2) В C строка представляет собой массив символов с нулевым завершением. Но в C++ существует тип, называемый 'string', который является' basic_string 'и не является массивом символов. – songziming