我有一个以下的类(只有部分,更多的类中的字段)
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或通过编写新的方法),这将在&lt;&lt;&lt;&lt;运营商
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]);
}
答案 0 :(得分:3)
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]);
}
答案 1 :(得分:2)
您可以使用sprintf替换printf的使用,然后使用它来实现运算符&lt;&lt;对于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';
}
答案 2 :(得分: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];