我正在尝试将传递给mqtt回调函数的byte *参数转换为int进行比较,但我似乎无法使其正常工作。任何帮助都会受到欢迎。
int fsrReading;
void callback(char* topic, byte* payload, unsigned int length) {
for (int i=0;i<length;i++) {
Serial.print((char)payload[i]); // This works well
fsrReading = int((char)payload[i]);
if (fsrReading < 0){
...
答案 0 :(得分:2)
执行此操作的正确方法取决于正在使用的数字的表示形式。
我怀疑该消息是一个数字的字符串表示形式:“1234”,它是作为ascii字节值数组接收的。
如果是这种情况,您可以重建String对象并将其转换为int:
int fsrReading;
void callback(char* topic, byte* payload, unsigned int length) {
String value = "";
for (int i=0;i<length;i++) {
value += (char)payload[i];
}
fsrReading = value.toInt();
...
在这里的arduino教程中有一个将String转换为Int的示例:https://www.arduino.cc/en/Tutorial/StringToIntExample
答案 1 :(得分:0)
编辑:解释前的原始答案部分:
取决于编译器,编译器选项等char
可以是signed
或unsigned
,通过(char)
投射可能与您期望的不同。
示例:
payload [i]是0x81
unsigned char - &gt; 129,然后> 0
signed char - &gt; -127,然后&lt; 0
你的演员通过(char)是多余的(和我说的那样不稳定)
我不会提供示例代码,因为我不了解您的目标。代码有矛盾。
免责声明:您的byte
似乎是非标准类型。我相信即unsigned char
这样的类型从不<0。
这个变量的主要含义是什么?在深层,它是签名还是未签名?您可以投射(unigned char)
,但永远不会<0或(signed char)
- 由您决定
编辑: 在提问者的评论之后,从knolleary hot解释长度(重要的是:循环感的改变,也许你理解作者正确)我给纯C转换
int val = 0;
for (int i=0; i<length; i++) {
val = val*10 + payload[i]-'0';
}
// If someone know end of number is marked in different way, need implement break of `for`
fsrReading =val;
我相信我的CPU周期/ RAM更好。
EDIT2:我从Arduino社区读过很少的资料,循环连接到字符串的问题就像许多语言一样:很多很小的分配(虽然这里完全不需要连接)。许多优秀的Arduino程序员对过度使用String
至关重要。它不是秘密知识&#34;,它是编程的一般规则。