1

私は次のクラスを持っています(クラス内の一部のフィールドのみ、はるかに多くのフィールド)

class Network{
public:
      string src_ip_;
      string alternative_src_ip_;
      array<unsigned char,6> mac_;
      string toString(){
           stringstream ss;
           ss << src_ip_ << SEPERATOR << alternative_src_ip_ << SEPERATOR ;
           return ss.str();
      }
}

フォーマットされたMac(:)をtoStringメソッドに追加したいですか?<<演算子で組み合わせてこれを行う私のprintMacメソッドを採用する簡単な方法はありますか(一般化するか、新しいものを書くことによって)

void printMac(array<unsigned char, 6> mac) {
    printf("%02x:%02x:%02x:%02x:%02x:%02x\n", 
            (unsigned char) mac[0], (unsigned char) mac[1],
            (unsigned char) mac[2], (unsigned char) mac[3],
            (unsigned char) mac[4], (unsigned char) mac[5]);
}
4

3 に答える 3

3

IO マニピュレータを使用します。

std::ostringstream s;
unsigned char arr[6] = { 0, 14, 10, 11, 89, 10 };

s << std::hex << std::setfill('0');

for (int i = 0; i < sizeof(arr); i++)
{
    if (i > 0) s << ':';

    // Need to:
    //  - set width each time as it only
    //    applies to the next output field.
    //  - cast to an int as std::hex is for
    //    integer I/O
    s << std::setw(2) << static_cast<int>(arr[i]);
}
于 2012-10-02T15:07:30.957 に答える
2

printf の使用を sprintf に置き換えてから、それを使用して ostreams の operator<< を実装できます。

void printMac(array<unsigned char, 6> mac, char (&out)[18]) {
    sprintf(out, "%02x:%02x:%02x:%02x:%02x:%02x", 
            (unsigned char) mac[0], (unsigned char) mac[1],
            (unsigned char) mac[2], (unsigned char) mac[3],
            (unsigned char) mac[4], (unsigned char) mac[5]);
}

std::ostream &operator<<(std::ostream &os, std::array<unsigned char, 6> mac) {
    char buf[18];
    printMac(mac, buf);
    return os << buf << '\n';
}
于 2012-10-02T15:32:09.043 に答える
0

printf のようなコードを維持したい場合は、Boost.Formatを試すことができます。

ss << boost::format("%02x:%02x:%02x:%02x:%02x:%02x\n") % mac[0] % mac[1] % mac[2] % mac[3] % mac[4] % mac[5];
于 2012-10-02T15:08:44.340 に答える