5

ほとんどの場合、私はPythonで作業しているため、repr()任意のバイトの文字列が渡されると、人間が読める16進形式で出力される関数を高く評価しています。最近、私はCでいくつかの作業を行っていて、Pythonrepr関数を見逃し始めています。私はインターネットでそれに似たもの、できれば次のようなものを探していましたが、void buffrepr(const char * buff, const int size, char * result, const int resultSize)運が悪かったのですが、これを行う簡単な方法を知っている人はいますか?

4

3 に答える 3

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;
    }
  }
}
于 2012-07-22T15:59:35.607 に答える
0

最も簡単な方法は、printf()/sprintf()とフォーマット指定子%xを使用することです。%X

于 2012-07-22T15:59:48.803 に答える
0

左側にストリームオブジェクトがある「<<」演算子に依存することで、この問題に部分的に取り組みました。この演算子をクラスに実装すると、それらのクラス(および標準のクラス)は次のソリューションで機能します。

次に、オブジェクトをprintf関数で使用できるac文字列に変換する関数とマクロを定義します。

// 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をac文字列に変換するマクロがあります。

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

このように呼んでください:

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

Pythonクラスが独自のrepr()メソッドを実装できるのと同じように、「<<」を実装している限り、どのクラスもこのマクロで動作させることができます。

于 2016-11-30T01:36:06.967 に答える