Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:将字符*中的十六进制解释为uint8\t_C++_Char_Hex - Fatal编程技术网

C++ C++;:将字符*中的十六进制解释为uint8\t

C++ C++;:将字符*中的十六进制解释为uint8\t,c++,char,hex,C++,Char,Hex,我需要有一个字符*在下面的格式有一些十六进制值 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

我需要有一个字符*在下面的格式有一些十六进制值

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;
std::string十六进制字符串;
创建十六进制字符串((uint8)buf,12,十六进制字符串);
标准::cout
为单个字符分配内存并用值12对其进行初始化。使用
[]
分配阵列:

new char[12];
但只有在您实际需要动态分配时才使用
new[]
;如果只需要代码块中的数组,请使用自动数组:

char buf[12];
如果确实需要
new[]
,请记住在完成后删除它(使用
delete[]
,而不仅仅是
delete
)。更好的方法是使用
std::string
std::vector
等类型为您管理数组

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

new char[12];
但只有在您实际需要动态分配时才使用
new[]
;如果只需要代码块中的数组,请使用自动数组:

char buf[12];
如果确实需要
new[]
,请记住在完成后删除它(使用
delete[]
,而不仅仅是
delete
)。更好的是,使用诸如
std::string
std::vector
之类的类型为您管理数组。

TL;DR:用于在线编译和执行

这是一个工作代码。您应该使用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;
}
#包括
#包括
#包括
#包括
void create_hex_str(uint8_t*数据、int len、std::string和tgt)
{
std::stringstream-ss;
ssTL;DR:用于在线编译和执行

这是一段有效的代码。您应该使用new char[12]而不是new char(12),但在这种特殊情况下,您甚至不需要使用new char。前者将用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;
}
#包括
#包括
#包括
#包括
void create_hex_str(uint8_t*数据、int len、std::string和tgt)
{
std::stringstream-ss;


ss,请下次粘贴一个工作片段…目标将无法按原样编译,包含项丢失,等等。为什么在这里使用
new
而不是直接声明?为什么不返回
std::string
而不是引用参数?@UchiaItachi我目前使用它,因为将来我将不得不分配内存dyn友好地根据输入标志添加十六进制。@NNONNEO-我也可以这样做。这只是我正在重复使用的一个现有函数。请下次粘贴一个工作代码段……目标将不会按原样编译,缺少包含项等。为什么在此处使用
new
而不是直接声明?为什么不返回
std::string
inste是否有引用参数?@UchiaItachi我目前使用它,因为将来我将不得不动态分配内存并根据输入标志添加十六进制。@NNONNEO-我也可以这样做。这只是一个我正在重复使用的现有函数。@LaszloPapp:的确,正如我在第二段中所说的。好的,那还没有出现在何时我查过。:)谢谢你指出这一点。我有一个字符*,因为将来我需要根据输入标志动态创建十六进制并放入其中。我只是尝试了一个字符数组,它会打印正确的十六进制。但它没有使用字符*。@Roshan:你是否更改为使用
[]
而不是
()
?正如我所说,
new char(12)
没有分配足够的内存,因此您很可能会出现数据损坏或其他未定义的行为。(如果您确实需要动态数组,我强烈建议您使用
std::string
std::vector
,而不要与
new
混在一起。)。我也尝试过@MikeSeymour,但我没有得到预期的结果。不过它使用了一个数组。我不明白为什么。@LaszloPapp:的确,正如我在第二段中所说。好的,我检查时还没有。谢谢你指出这一点。我有一个字符*因为将来我需要根据输入f动态创建十六进制延迟并放入其中。我只是尝试使用字符数组,它会打印正确的十六进制。但它不会使用字符*。@Roshan:您是否更改为使用
[]
而不是
()
?正如我所说,
新字符(12)
没有分配足够的内存,因此您可能会出现数据损坏或其他未定义的行为。(如果您确实需要动态数组,我强烈建议您使用
std::string
std::vector
,而不要与
new
混在一起。)。我也尝试过@MikeSeymour,但我没有得到预期的结果。但它与数组一起工作。我不明白为什么。谢谢。但我需要它与char*一起工作,因为将来我将添加动态十六进制字节。我也尝试过,它与char[]一起工作但不是用字符*。你知道为什么吗?@Roshan:我也已经解释过了,但为了方便起见,我刚刚更新了代码。你能试试这个吗,请通过提供的注释运行它,并与我(即预期)的输出进行比较吗?是的,我试过了。对我来说仍然不太好:(c0 a1 56 08 28 d2 45 f6 c0 f1 56 08我不知道确切的解释,但它被错误地解释了。我使用了reinterpret_cast,现在可以正常工作了。:-)谢谢您的帮助。@Roshan:重新解释cast where?另外,一旦解决方案起作用,请选择它。谢谢。但我需要它来处理char*,因为将来我将添加动态十六进制字节。我