我需要使用以下格式的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 *。
答案 0 :(得分:5)
new char(12);
为单个字符分配内存并使用值12初始化它。使用[]
分配数组:
new char[12];
但是如果你真的需要动态分配,只能使用new[]
;如果您只需要代码块中的数组,那么请使用自动数组:
char buf[12];
如果您确实需要new[]
,请记得在完成后将其删除(使用delete[]
,而不仅仅是delete
)。更好的是,使用std::string
类型(例如std::vector<char>
或{{1}})为您管理数组。
答案 1 :(得分:2)
TL; DR:Click here用于在线编译和执行。
这是一个有效的代码。你应该使用new char [12]而不是new char(12),但在这种特殊情况下,你甚至不需要新的。前者将构造一个包含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