2

我环顾四周,一直找不到将 boost 格式返回的内容存储到 char 数组中的解决方案。例如:

#include "stdafx.h"
#include <iostream>
#include <boost/format.hpp>

int main()
{
    unsigned int arr[5] = { 0x05, 0x04, 0xAA, 0x0F, 0x0D };
    char buf[1024];
    buf[] = boost::format("%02X-%02X-%02X-%02X-%02X") // error on this line
        % arr[0]
        % arr[1]
        % arr[2]
        % arr[3]
        % arr[4];
    system("pause");
    return 0;
}

我得到错误:

错误:期望一个表达式

我不知道我是否只是忽略了一个简单的解决方案,但我需要一个 const char* 作为回报。有大量代码暂时无法重写。我正在研究 VS2013 C++

4

2 回答 2

1

您可以使用来自 boost iostreams 的 array_sink:

Live On Coliru

#include <iostream>
#include <boost/format.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>

namespace io = boost::iostreams;

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

    io::stream<io::array_sink> as(buf);

    as << boost::format("%02X-%02X-%02X-%02X-%02X")
        % arr[0]
        % arr[1]
        % arr[2]
        % arr[3]
        % arr[4];


    // to print `buf`:
    std::cout.write(buf, as.tellp());
}

印刷

05-04-AA-0F-0D
于 2015-09-22T21:41:06.463 回答
1

您可以使用{fmt} 库作为 Boost 格式的更快替代方案。它允许直接格式化为字符数组:

#include <fmt/format.h>

int main() {
  unsigned int arr[5] = { 0x05, 0x04, 0xAA, 0x0F, 0x0D };
  char buf[1024];
  fmt::format_to(buf, "{:02X}-{:02X}-{:02X}-{:02X}-{:02X}",
                 arr[0], arr[1], arr[2], arr[3], arr[4]);
}

或者,更好的是,它可以自动分配数组(在这种情况下,它将完全在堆栈上分配,因此与固定缓冲区相比没有性能损失):

#include "format.h"

int main() {
  unsigned int arr[5] = { 0x05, 0x04, 0xAA, 0x0F, 0x0D };
  fmt::memory_buffer buf;
  fmt::format_to(buf, "{:02X}-{:02X}-{:02X}-{:02X}-{:02X}",
                 arr[0], arr[1], arr[2], arr[3], arr[4]);
}

该库使用类似 Python 的格式字符串语法,但printf也提供了安全实现。

免责声明:我是这个库的作者。

于 2015-09-23T20:53:13.273 回答