по большей части я работаю на Python, и поэтому я высоко оценил функцию repr()
, которая при передаче строки произвольных байтов распечатывает удобочитаемый шестнадцатеричный формат. Недавно я немного поработал на C и начал скучать по функции Python repr
. Я искал в Интернете что-то похожее на это, желательно что-то вроде void buffrepr(const char * buff, const int size, char * result, const int resultSize)
Но мне не повезло, кто-нибудь знает простой способ сделать это?
Repr в стиле Python для буфера char * в c?
Ответы (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;
}
}
}
sprintf
плохо. вместо этого используйте snprintf
.
- person ThiefMaster; 22.07.2012
#ifdef WIN32\n#define snprintf _snprintf\n#endif
Microsoft, похоже, любит переименовывать функции!
- person john-charles; 22.07.2012
Самым простым способом будет printf()
/sprintf()
со спецификаторами формата %x
и %X
.
Я частично подошел к этой проблеме, полагаясь на оператор "‹‹" с объектом потока слева. Если вы реализуете этот оператор в своих классах, эти классы (и стандартные) будут работать со следующим решением.
Затем мы определяем функцию и макрос, который преобразует ваш объект в строку 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().