将 int16_t 转换为 uint_8t*
Casting int16_t to uint_8t*
我有一个库驱动的结果存储为 int16_t 值(它是一个负数,我可以使用它的绝对值)和另一个库函数需要这个值稍后在表格 uin8_t*。不使用 String 如何做到这一点?
以下代码有效,但使用了可怕的字符串。有没有办法在不调用 String 或 std::string?
的情况下执行此操作
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_t变成uint8_t*呢?
下面的评论中已经指出
Serial.println(static_cast<unsigned>(*finalVal));
有效,但此解决方案将 uint8_t 转换为 unsigned int 并且该方法需要 uint8_t*.
我来自 Java 之类的地方,将整数转换为字符串如此困难,这似乎很疯狂。
uint8_t
类型的指针不能指向int16_t
类型的对象;您需要复制 firstVal
的值,但因此您需要一个单独的对象来获取该值。
uint8_t firstValAbs = firstVal >= 0 ? firstVal : -firstVal;
uint8_t* secondVal = &firstValAbs;
注意:uint8_t x = -34
将 而不是 给你 -34
的绝对值,即它不会导致 34
。您宁愿得到 -34
的二进制补码,即 255-34+1 == 222
.
int16_t
使用 16 位(-32,768 到 32,767)存储带符号的数值。
uint8_t
使用 8 位(0 到 255)存储无符号数值。
如果您确定您的 int16_t
值在更改符号后适合 uint8_t
,您可以直接分配它:
int16_t firstVal = -76;
uint8_t secondVal = -firstVal;
现在,如果您需要指向第二个值的指针,只需创建它即可。你不能直接指向firstVal
因为你需要存储改变的值。
uint8_t* secondValPointer = &secondVal;
此 uint8_t*
可能被解释为指向您库中字符的指针。通常,您应该为此目的使用 char(也是 8 位,但 it is implementation defined if it is signed or unsigned)。您可以将此指针转换为 char*
,但您需要告诉编译器您要使用 reinterpret_cast:
在指针之间进行转换
char *secondValAsChar = reinterpret_cast<char*>(secondValPointer);
现在,您可以将此指针视为指向字符的指针。例如下面的代码将打印 'L' 因为 L 的 ASCII 码是 76:
std::cout << *secondValAsChar << std::endl;
但是,你必须非常小心这个指针,因为 secondValAsChar 不是空终止字符串,所以你不能使用像 strcat
.
这样的旧的常用方法
我有一个库驱动的结果存储为 int16_t 值(它是一个负数,我可以使用它的绝对值)和另一个库函数需要这个值稍后在表格 uin8_t*。不使用 String 如何做到这一点?
以下代码有效,但使用了可怕的字符串。有没有办法在不调用 String 或 std::string?
的情况下执行此操作 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_t变成uint8_t*呢?
下面的评论中已经指出
Serial.println(static_cast<unsigned>(*finalVal));
有效,但此解决方案将 uint8_t 转换为 unsigned int 并且该方法需要 uint8_t*.
我来自 Java 之类的地方,将整数转换为字符串如此困难,这似乎很疯狂。
uint8_t
类型的指针不能指向int16_t
类型的对象;您需要复制 firstVal
的值,但因此您需要一个单独的对象来获取该值。
uint8_t firstValAbs = firstVal >= 0 ? firstVal : -firstVal;
uint8_t* secondVal = &firstValAbs;
注意:uint8_t x = -34
将 而不是 给你 -34
的绝对值,即它不会导致 34
。您宁愿得到 -34
的二进制补码,即 255-34+1 == 222
.
int16_t
使用 16 位(-32,768 到 32,767)存储带符号的数值。
uint8_t
使用 8 位(0 到 255)存储无符号数值。
如果您确定您的 int16_t
值在更改符号后适合 uint8_t
,您可以直接分配它:
int16_t firstVal = -76;
uint8_t secondVal = -firstVal;
现在,如果您需要指向第二个值的指针,只需创建它即可。你不能直接指向firstVal
因为你需要存储改变的值。
uint8_t* secondValPointer = &secondVal;
此 uint8_t*
可能被解释为指向您库中字符的指针。通常,您应该为此目的使用 char(也是 8 位,但 it is implementation defined if it is signed or unsigned)。您可以将此指针转换为 char*
,但您需要告诉编译器您要使用 reinterpret_cast:
char *secondValAsChar = reinterpret_cast<char*>(secondValPointer);
现在,您可以将此指针视为指向字符的指针。例如下面的代码将打印 'L' 因为 L 的 ASCII 码是 76:
std::cout << *secondValAsChar << std::endl;
但是,你必须非常小心这个指针,因为 secondValAsChar 不是空终止字符串,所以你不能使用像 strcat
.