C ++将字节二进制值转换为字符串

时间:2009-06-26 22:51:01

标签: c++

如何将表示MAC地址的6个字节转换为以冒号分隔的十六进制值显示地址的字符串?

由于

3 个答案:

答案 0 :(得分:4)

您可能希望将六个字节的序列格式化为:

aa:bb:cc:dd:ee:ff

其中aa是以十六进制格式化的第一个字节。

这样的事情应该做:

char MAC[6]; //< I am assuming this has real content

std::ostringstream ss;
for (int i=0; i<6; ++i) {
    if (i != 0) ss << ':';
    ss.width(2); //< Use two chars for each byte
    ss.fill('0'); //< Fill up with '0' if the number is only one hexadecimal digit
    ss << std::hex << (int)(MAC[i]);
}

return ss.str();

如果您非常希望以类似强制转换的方式执行此操作(从此处的标题中猜测),您可以创建一个MAC类,为它实现ostream-operator(如我给定的代码)并使用{{1} }。

答案 1 :(得分:3)

不确定你的意思是演员还是转换。如果转换,那么它取决于你想要的形式。你可能想要Hex,base-64,octal,......

如果你想要十六进制,请考虑STLSoftformat_bytes()函数,它可以进行各种排序和分组。

如果您想要base-64,请考虑b64 library

HTH

[编辑]与OP上的编辑一致,完整的impl将是:

#include <stlsoft/conversion/byte_format_functions.hpp>

#include <stdio.h>

int main()
{
    unsigned char mac[6];

    char result[STLSOFT_NUM_ELEMENTS(mac) * 3];

    stlsoft::format_bytes(mac, sizeof(mac), &result[0], STLSOFT_NUM_ELEMENTS(result), 1, ":");

    puts(result);

    return 0;
}

在这种情况下不需要来检查format_bytes()的返回值,因为你传入了足够的写缓冲区。在实际案例中,您需要检查

答案 2 :(得分:1)

  1. 确保它已终止
  2. 你需要知道字符串的编码。如果是ASCII,一个简单的std :: string str((char *)your_buffer)就可以了。 your_buffer应该是unsigned char。如果不是,我们需要更多信息。