将float转换为unsigned char数组并打印

时间:2018-10-09 12:16:47

标签: c++

如何将float转换为unsigned char *数组并使用C ++打印?我有下面的函数,当我尝试打印时得到值-0.000000

已编辑:我有一个通用接口,该接口的功能返回unsigned char *。每个实现此功能的类都处理不同类型的数据,即:字符串,浮点数,双精度数,整数,字符。最后,我希望所有人都返回unsigned char *,而不仅返回char *,因为我关心每个函数将转换为字节数组的原因。

unsigned char * readRequest() {
    float preCent = distanceCentimeters();

    std::cout << "readRequest" << std::endl;
    printf("%.10f ", preCent); // print correct result

    unsigned char buf[4];
    memcpy(buf, &preCent, sizeof(preCent));

    printf(" %s ", buf); // print bytes
    printf(" %lf ", buf); // prints -0.000000
    std::cout << buf << std::endl; // print bytes
    std::cout << "readRequest" << std::endl;
    return buf;
}

unsigned char *readRequestArray;
readRequestArray = (unsigned char*) readRequest();
std::cout << readRequestArray << std::endl; // prints (null)

2 个答案:

答案 0 :(得分:2)

  

如何将float转换为无符号char *数组

取决于您希望通过这种转换实现的目标。

  • 如果要将其转换为文本表示形式,则可以使用字符串流。
  • 如果要将其转换为字节序列,则可以使用std::memcpy将这些字节复制到unsigned char的数组中(也可以使用std::byte):< / li>

示例:

unsigned char buf[sizeof preCent];
std::memcpy(buf, &preCent, sizeof preCent);
  

...并打印

  • 如果要使用文本表示,只需将字符串插入标准输出(std::cout
  • 如果要查看字节序列,则不能让流将字节数组解释为字符编码的字符串,因为二进制数据在该表示形式中没有意义。您可以迭代字节并显示每个字节的数值:

示例:

for(unsigned char c : buf)
    std::cout << std::hex << (int)c;

请注意转换为非字符整数类型,以防止流将字节解释为编码字符。


  

如何[打印]实际浮点值

     

我想在将浮点值转换为unsigned char *

之后打印它

使用std::memcpy反向将字节数组简单地转换回浮点数:

float converted_back;
std::memcpy(&converted_back, buf, sizeof converted_back);
std::cout << converted_back;

printf(" %lf ", buf); // prints -0.000000

%lf要求参数的类型为double(或float将转换为double)。但是,您传递了buf类型的unsigned char[4]。程序的行为是不确定的,因为您违反了此先决条件。

printf(" %s ", buf); // print bytes

%s说明符要求参数是一个以null结尾的字符串。您的字符数组不是以null结尾的。程序的行为是不确定的,因为您违反了此前提条件。此外,数组的数据在字符编码表示中毫无意义。

std::cout << buf << std::endl; // print bytes

字符流对插入的指针的要求与%s printf说明符相同。该行为是不确定的。

unsigned char buf[4];
...
return buf;

您返回一个指向本地数组的指针。该数组在函数末尾被破坏,并且返回的指针悬空。

std::cout << readRequestArray << std::endl;

您将悬挂指针插入字符流。您的程序的行为是不确定的。即使它不是悬空的,它用来指向的数组(本地buf)仍然不是以null结尾的字符串。

答案 1 :(得分:1)

使用%s打印将不起作用,因为当您有一个指向字节数组的char *指针时,它期望char *指向以空终止的字符串。使用%lf也不起作用,因为它期望double,并且char *与之不兼容。这两个都调用了undefined behavior

如果要打印存储在buf中的字节表示形式,则需要单独打印每个字符的值。

unsigned char buf[sizeof(preCent)];
memcpy(buf, &preCent, sizeof(preCent));

for (size_t i=0; i<sizeof(preCent); i++) {
    printf("%02x ", buf[i]);
}
printf("\n");