如何将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)
答案 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");