C++ 铸造国际16吨至国际8吨*
我有一个库驱动的结果存储为int16_t值(它是负数,我可以使用的绝对值)和另一个库函数,该函数在几步后以uin8_t*的形式需要该值。如何在不使用字符串的情况下做到这一点 下面的代码可以工作,但使用了可怕的字符串。有没有一种不用调用String或std::String的方法来实现这一点C++ 铸造国际16吨至国际8吨*,c++,arduino,int,uint8t,uint16,C++,Arduino,Int,Uint8t,Uint16,我有一个库驱动的结果存储为int16_t值(它是负数,我可以使用的绝对值)和另一个库函数,该函数在几步后以uin8_t*的形式需要该值。如何在不使用字符串的情况下做到这一点 下面的代码可以工作,但使用了可怕的字符串。有没有一种不用调用String或std::String的方法来实现这一点 void setup() { Serial.begin(9600); } void loop() { delay(5000); String initia
void setup() {
Serial.begin(9600);
}
void loop() {
delay(5000);
String initialVal= String(-fetchInt());
Serial.print("Initial value is: ");Serial.println(initialVal);//prints "76"
uint8_t medianVal[sizeof(initialVal);
medianVal.getBytes(medianVal, sizeof(initialVal));
Serial.print("median value is: ");Serial.println(medianVal);//prints "76"
uint8_t* finalVal = medianVal;
Serial.print("final value is: ");Serial.println((char*)finalVal);//prints "76"
}
int16_t fetchInt(){
return -76;
}
那么,如何将int16\u t转换为uint8\u t*
下面的评论指出:
Serial.println(static_cast(*finalVal))
可以工作,但此解决方案将uint8\u t转换为无符号int,并且该方法需要uint8\u t*
我来自Java之类的语言,把整数转换成字符串太难了,这似乎很疯狂。类型为uint8\u t的指针不能指向类型为
int16\u t
的对象;您需要复制firstVal
的值,但因此需要一个单独的对象来获取该值
uint8_t firstValAbs = firstVal >= 0 ? firstVal : -firstVal;
uint8_t* secondVal = &firstValAbs;
注意:
uint8\u t x=-34
不会给出-34
的绝对值,即不会产生34
。您将得到一个2的补码-34
,即255-34+1==222
int16\t
使用16位(-32768到32767)存储有符号的数值
uint8\t
使用8位(0到255)存储无符号数值
如果您确定更改符号后,您的int16\u t
值符合uint8\u t
,则只需分配它:
int16_t firstVal = -76;
uint8_t secondVal = -firstVal;
现在,如果需要指向第二个值的指针,可以创建它。您不能直接指向firstVal
,因为您需要存储更改后的值
uint8_t* secondValPointer = &secondVal;
此uint8\u t*
可以解释为指向库中字符的指针。通常情况下,您应该使用char(也是8位,但是)。您可以将此指针强制转换为char*
,但需要使用reinterpret\u cast告诉编译器您要在指针之间强制转换:
char *secondValAsChar = reinterpret_cast<char*>(secondValPointer);
char*secondValAsChar=reinterpret\u cast(secondValPointer);
现在,您可以将此指针视为指向字符的指针。例如,以下代码将打印“L”,因为L的ASCII代码为76:
std::cout << *secondValAsChar << std::endl;
std::cout这很奇怪,但如果理解正确-您希望将firstVal
的绝对值设置为secondVal
,而不考虑其符号(并且-假设您将16位整数转换为8位-可能会丢失数据)?是的。数字始终小于120,因此不会丢失保真度。您正在尝试将指针设置为-76。这真的是你想要的吗。您希望在那里找到什么?我正在寻找指向字母数字字符-76的指针,而不是整数值。这是一个无线电信号作为健康检查返回给发送者的强度。这听起来更像。具体点:什么库,哪种方法。这是一个很好的开始,但现在数值被转换成字母(例如76被转换成“L”),奇怪的是,有一个字符串从先前标记为“buf”的变量连接而来。如果您有uint8\u t*secondVal,结果将“-76”转换为“LHello World!”你不应该这样做,你的回答解决了我的问题。在我的代码中,它看起来像:Serial.println(static_cast(*finalVal))代码>现在输出正确的数字。对不起,我必须重新打开此文件static\u cast
将其转换为无符号int,并且它不再被要求uint8\u t*作为传递变量的方法接受。转换为无符号的unsigned
仅用于打印目的。如果函数需要一个uint8*
你应该给它finalVal
。对于我的输出,我使用Serial.print()。如果我在其他uint8_t*整数值上使用它,它将输出数值,而不是八位字节表示的ASCII字符。我必须使用uint8_t*而不是char*,因为库函数需要它。我为一个可编译的示例编辑了代码。