首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Arduino错误上将4个字节转换为long

在Arduino错误上将4个字节转换为long
EN

Stack Overflow用户
提问于 2015-12-06 18:36:25
回答 4查看 4.4K关注 0票数 7

我有一种很奇怪的矛盾。

我正在准备读取关于Arduino的二进制文件(对于midi球员,如果您感兴趣的话)。如果我试图将Arduino上的4个字节组合成一个long,就会给出一个错误的结果。

但是,如果我在PC上使用相同的代码,我将得到正确的值。

输入是: 0x12481248 (0x12,0x48,0x12,0x48) (实际上是一个随机数)。

阿迪诺: 4680。

代码::块表示: 306713160。

4680与0x1248相同,当您在Arduino上使用int而不是long (省略了2个字节)时,会得到相同的结果。

Arduino代码:

代码语言:javascript
运行
复制
void setup(){
    Serial.begin(57600);
    char read1 = 0x12;
    char read2 = 0x48;
    char read3 = 0x12;
    char read4 = 0x48;
    unsigned long testint = read1<<24|read2<<16|read3<<8|read4;
    unsigned long testint2 = 306713160;
    Serial.println(testint);
    Serial.println(testint2);
}

void loop(){}

testint2是为了表明它不是由Serial.println()引起的。串行监视器的输出确实是:

四千六百八十

306713160

C++代码:

代码语言:javascript
运行
复制
#include <iostream>

using namespace std;

int main(){
    char read1 = 0x12;
    char read2 = 0x48;
    char read3 = 0x12;
    char read4 = 0x48;
    unsigned long testint = read1<<24|read2<<16|read3<<8|read4;
    cout << testint;
}

知道怎么回事吗?

另外,有人知道用Arduino/SD库转换字节的更好/更漂亮的方法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-12-06 18:46:21

在Arduino,int size is 16 bits

在这一行:

代码语言:javascript
运行
复制
unsigned long testint = read1<<24|read2<<16|read3<<8|read4;

即使结果存储在unsigned long (32位)中,按位操作也是在int上进行的。

将此行更改为:

代码语言:javascript
运行
复制
unsigned long testint = (unsigned long)read1 << 24 
                      | (unsigned long)read2 << 16
                      | (unsigned long)read3 << 8
                      | (unsigned long)read4;
票数 11
EN

Stack Overflow用户

发布于 2015-12-06 18:45:37

我期望在任何平台上得到结果4680 (=0x1248),而在任何平台上,sizeof(int)=2,我认为这就是arduino的情况。

这是因为(read1 << 24)被隐式转换为int (不太长),所以上两个字节就会丢失。Yout应该首先将读*转换为未签名的long first

票数 4
EN

Stack Overflow用户

发布于 2016-11-16 09:03:10

还可以使用以下代码:

代码语言:javascript
运行
复制
uint8_t data[4];
data[0]=read4;
data[1]=read3;
data[2]=read2;
data[3]=read1;
unsigned long testint =*(unsigned long*)(&data);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34121110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档