c的char *缓冲区的Python样式repr?

时间:2012-07-22 15:51:35

标签: python c repr

我在Python工作的大部分时间,因此我对repr()函数表示了极大的赞赏,当传递一串任意字节时,它将打印出人类可读的十六进制格式。最近我在C中做了一些工作,我开始想念python repr函数。我一直在互联网上寻找与它类似的东西,最好像void buffrepr(const char * buff, const int size, char * result, const int resultSize)但是我没有运气,是否有人知道这样做的简单方法?

3 个答案:

答案 0 :(得分:1)

sprintf(char *,“%X”,b);

你可以像这样循环(非常简单):

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;
    }
  }
}

答案 1 :(得分:0)

最简单的方法是使用printf()sprintf()格式说明符%x / %X

答案 2 :(得分:0)

我部分依靠“<<”来解决这个问题左侧有流对象的运算符。如果在类上实现此运算符,那么这些类(以及标准类)将适用于以下解决方案。

接下来我们定义一个函数和一个宏,它将你的对象转换为一个可以在printf函数中使用的c字符串:

// 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));

任何类都可以使用这个宏,只要它实现“&lt;&lt;”,就像任何Python类都可以实现自己的repr()方法一样。