Repr в стиле Python для буфера char * в c?

по большей части я работаю на Python, и поэтому я высоко оценил функцию repr(), которая при передаче строки произвольных байтов распечатывает удобочитаемый шестнадцатеричный формат. Недавно я немного поработал на C и начал скучать по функции Python repr. Я искал в Интернете что-то похожее на это, желательно что-то вроде void buffrepr(const char * buff, const int size, char * result, const int resultSize) Но мне не повезло, кто-нибудь знает простой способ сделать это?


person john-charles    schedule 22.07.2012    source источник


Ответы (3)


sprintf(char*, "%X", б);

вы можете выполнить цикл (очень просто) следующим образом:

void buffrepr(const char * buff, const int size, char * result, const int resultSize)
{
  while (size && resultSize)
  {
    int print_count = snprintf(result, resultSize, "%X", *buff); 
    resultSize -= print_count;
    result += print_count;
    --size;
    ++buff;

    if (size && resultSize)
    {
      int print_count = snprintf(result, resultSize, " ");
      resultSize -= print_count;
      result += print_count;
    }
  }
}
person Josh Petitt    schedule 22.07.2012
comment
sprintf плохо. вместо этого используйте snprintf. - person ThiefMaster; 22.07.2012
comment
Это сработало отлично, обратите внимание, что для компиляции в Windows вам нужно добавить что-то вроде #ifdef WIN32\n#define snprintf _snprintf\n#endif Microsoft, похоже, любит переименовывать функции! - person john-charles; 22.07.2012
comment
Не слишком удивительно, что Microsoft переименовала такую ​​полезную функцию, поскольку они определяют тип всех указателей, я полагаю, что их мастерство в C не слишком велико. - person Kenneth Wilke; 28.10.2015

Самым простым способом будет printf()/sprintf() со спецификаторами формата %x и %X.

person matthias    schedule 22.07.2012

Я частично подошел к этой проблеме, полагаясь на оператор "‹‹" с объектом потока слева. Если вы реализуете этот оператор в своих классах, эти классы (и стандартные) будут работать со следующим решением.

Затем мы определяем функцию и макрос, который преобразует ваш объект в строку c, которую можно использовать в функции printf:

// return a std::string representation of argument
template <typename T> std::string string_repr(T myVar)
{
    std::stringstream ss;
    ss << myVar;

    return ss.str();
}

Затем у нас есть макрос, который инкапсулирует вышеуказанную функцию, преобразуя std::string в строку c:

#define c_repr(_myVar) (string_repr(_myVar).c_str())

Назовите это так:

printf("prevXfm = %s  newXfm = %s\n", c_repr(prevXfm), c_repr(newXfm));

Любой класс можно заставить работать с этим макросом, если он реализует "‹‹", точно так же, как любой класс Python может реализовать свой собственный метод repr().

person jbillfinger    schedule 30.11.2016