1

我需要具有以下格式的 char* 具有一些十六进制值。

char *buf = new char(12);
buf[0] = 0x2;
buf[1] = 0x0;
buf[2] = 0x3;
buf[3] = 0x3;
buf[4] = 0x0;
buf[5] = 0x0;
buf[6] = 0x6;
buf[7] = 0x4;
buf[8] = 0x0;
buf[9] = 0x2;
buf[10] =0x0;
buf[11] =0x0;

当我尝试以这种方式打印它们时-

std::string hex_string;
create_hex_str((uint8_t*)buf, 12, hex_string);
std::cout << hex_string;

打印功能的定义:

void create_hex_str(uint8_t *data, int len, std::string &tgt)
{
    std::stringstream ss;
    ss << std::hex << std::setfill('0');
    ss << "\n";
    for (int i=0; i<len; i++)
    {
        ss << std::setw(2) << static_cast<unsigned>(data[i]) << " ";        
    }
    target = ss.str();
}

我得到完全不同的输出:f0 a1 56 08 28 02 3c f6 40 f8 56 08

有人可以帮我吗?如果这是一个非常微不足道的问题,我很抱歉,但我根本无法理解这里发生了什么。我究竟做错了什么?而且我必须将字节数组表示为 char*。

4

2 回答 2

5
new char(12);

它为单个字符分配内存并使用值 12 对其进行初始化。[]用于分配数组:

new char[12];

但仅new[]在您确实需要动态分配时使用;如果您只需要代码块中的数组,则使用自动数组:

char buf[12];

如果您确实需要new[],请记住在完成后将其删除(使用delete[],而不仅仅是delete)。更好的是,使用RAII类型,例如std::stringstd::vector<char>来为您管理阵列。

于 2013-08-24T14:33:17.990 回答
2

TL;DR:单击此处进行在线编译和执行。

这是一个工作代码。您应该使用 new char[12] 而不是 new char(12),但在这种特殊情况下,您甚至不需要 new。前者将构造一个包含 12 个元素的数组,而后者只为一个元素调用构造函数。

另外,请注意您使用了“target”而不是“tgt”,因此您实际上并没有设置输出参数。

#include <string>
#include <sstream>
#include <iomanip>
#include <iostream>

void create_hex_str(uint8_t *data, int len, std::string &tgt)
{
    std::stringstream ss;
    ss << std::hex << std::setfill('0');
    ss << "\n";
    for (int i=0; i<len; i++)
    {
        ss << std::setw(2) << static_cast<unsigned>(data[i]) << " ";        
    }
    tgt = ss.str();
}

int main()
{
    /* char buf[] = {
        0x2,
        0x0,
        0x3,
        0x3,
        0x0,
        0x0,
        0x6,
        0x4,
        0x0,
        0x2,
        0x0,
        0x0
    }; */

    char *buf = new char[12];
    buf[0] = 0x2;
    buf[1] = 0x0;
    buf[2] = 0x3;
    buf[3] = 0x3;
    buf[4] = 0x0;
    buf[5] = 0x0;
    buf[6] = 0x6;
    buf[7] = 0x4;
    buf[8] = 0x0;
    buf[9] = 0x2;
    buf[10] =0x0;
    buf[11] =0x0;

    std::string hex_string;
    create_hex_str((uint8_t*)buf, 12, hex_string);
    std::cout << hex_string;
}

我使用以下命令构建了此代码:g++ --std=c++11 main.cpp && ./a.out

输出是:02 00 03 03 00 00 06 04 00 02 00 00

于 2013-08-24T14:38:05.590 回答