将格式化的mac地址写入stringstream

问题描述 投票:1回答:3

我有一个以下类(在类中只有部分,更多的字段)

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

我想在toString方法中添加格式化的mac(带:)?是否有一种简单的方法来采用我的printMac方法(通过generelize或通过编写新的方法),这将在<<运算符中组合使用

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]);
}
c++
3个回答
2
投票

您可以使用sprintf替换printf的使用,然后使用它来实现operator << for ostreams

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

3
投票

使用IO manipulators

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

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];
© www.soinside.com 2019 - 2024. All rights reserved.