2009-11-04 39 views
6

は、次のことを考えてみましょう: "05-04-AA-0F-0D":boost :: formatで16進数の出力を生成するには?

#include <vector> 
#include <string> 
#include <iostream> 

#include <boost/format.hpp> 
#include <boost/assign.hpp> 
#include <boost/assign/list_of.hpp> 
#include <boost/assign/std/vector.hpp> 

using namespace std; 

typedef unsigned char byte; 
typedef vector<byte> byte_array; 

const byte_array bytes = list_of(0x05)(0x04)(0xAA)(0x0F)(0x0D); 

int main() 
{ 
    const string formatter = "%1%-%2%-%3%-%4%-%5%"; 
    const string result = (format(formatter) 
          % bytes[0] 
          % bytes[1] 
          % bytes[2] 
          % bytes[3] 
          % bytes[4] 
            ).str(); 
    cout << result << endl; 
    return 0; 
} 

私はと印刷結果を見てみたいと思います。それを達成するためにフォーマッタ文字列に何をする必要がありますか?コンパイルおよびテスト

+0

'bytes [5]'が範囲外です –

+0

whoops、私の悪い編集 – Maciek

+0

@Maciek私はそれが2年遅れていることを知っていますが、ここで私はこれらの状況で何をしているのですか? ...元の構造体(バイト)を保持したいのであれば、通常は修飾子(setfill、setbase)を使いません。各バイトを '(unsigned int)(unsigned char)'でキャストします。 – nhed

答えて

8

#include <boost/format.hpp> 
#include <iostream> 

using namespace std; 
using namespace boost; 

int main() 
{ 
    unsigned int arr[5] = { 0x05, 0x04, 0xAA, 0x0F, 0x0D }; 

    cout << format("%02X-%02X-%02X-%02X-%02X") 
       % arr[0] 
       % arr[1] 
       % arr[2] 
       % arr[3] 
       % arr[4] 
     << endl; 
} 
+0

この回答では、要素の種類は元の質問の要素の種類とは異なります。具体的には、元の要素の型は 'unsigned char'ですが、答えは 'unsigned int'です。私はブースト::書式を使用して問題を抱えています。それは整数ではなく文字として書式設定されているunsigned charです。このiostreamsは大丈夫だろうが、フォーマットでは、タイプセーフティではなく、それを欲しいと言っている方法を出力する必要があります。はい、私はキャストすることができますが、それはカウンターのようです。同様の理由で要素タイプが変更されましたか? –

+0

@Chris Cleeland - ああ、私はおそらく車輪で眠っていた。 bytewiseプロトコルに取り組んで、私はこれを数回打ちました。あなたが言うように、0x61は97の代わりに 'a'として出てきます。 (残念ながら)正しい応答は、int(arr [0])のようにラップするように見えます。私はprintfの振る舞いから離れているので、これが設計上のものであるかどうかは不思議です。明確化のために –

+0

ありがとう! boost :: formatはあなたのためにキャストをしません。うーん... –

2

のiostreamを使用しただけ、それは出力ストリームを操作することによって行うことができます。以下の簡単な例は、何ができるかを示しています。

#include <iostream> 
#include <iomanip> 

unsigned char a = 0x05; 
unsigned char b = 0xA8; 

using namespace std; 

int main() 
{  
    std::cout << setbase(16) << setfill('0') << setw(2) << 
     (short)a << "-" << (short)b << std::endl; 
} 

出力は次のようになります。05-A8

ブースト::フォーマットは、同じ形式のマニピュレータを使用することができます。

サンプルの例はboost::format pageです。

using boost::format; 
using boost::io::group; 
// Using manipulators, via 'group' : 
cout << format("%2% %1% %2%\n") % 1 % group(setfill('X'), hex, setw(4), 16+3) ; 
// prints "XX13 1 XX13\n" 

これは、必要なものを手に入れるのに役立ちます。

2

ブーストフォーマッタは、printfの書式設定を考慮しています。試しましたか:

const string formatter = "%02x-%02x-%02x-%02x-%02x"; 

値が8ビットであることを示すために、xの前に "hh"を追加することもできます。

関連する問題