首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

Stack Overflow用户

发布于 2022-03-18 21:39:38

代码语言:javascript
运行
复制
Here is another way to create 4 bytes to Long value and the reverse. Includes a simple test for these functions.

byte dataj[4];  //4 byte array output
unsigned long testint;
unsigned long testnum, temp;
unsigned long prev_time, cur_time = 0;

void setup() {
  Serial.begin(115200);

  Serial.println(F("********** Initalized +++++++"));
  //   -----4294967295  Max value
  testnum = 4294967295L;  //Start at maximum value

  for (int i = 0; i < 999; i++)
  {
    Serial.print(F("Test #"));
    Serial.print( i + 1);

    Serial.print(F("  Initial value = "));
    Serial.println(testnum);

    prev_time = micros();
    Long_2_Four_Bytes(testnum);


    testint = Four_Bytes_2_Long(dataj[3], dataj[2], dataj[1], dataj[0]);
    cur_time = micros();

    Serial.print(F("         final value   = "));
    Serial.print(testint);
    Serial.print("  time (microsec) = ");  Serial.print(prev_time - cur_time);

    if (testint == testnum)
      Serial.println();
    else
      Serial.println(F("  ERROR  <-----"));

    testnum--;

    delay(50);
  }
}

void loop() {}

//---- Long_2_Four_Bytes ---------------------------
// Fills an array 'dataj[]' with 4 bytes representing
// the 'unsigned long val'.
// Input : unsigned long number - range 0 - 4294967295
// Output : dataj[] where dataj[0] = LSB  & dataj[3] = MSB
//---------------------------------------------------
void Long_2_Four_Bytes(unsigned long val )
{
  unsigned long temp;
  byte data1[] = { 0, 0, 0, 0}; //4 byte array

  temp = val;

  for (byte bytegroup = 0; bytegroup  < 4; bytegroup ++)
  {
    int offset = bytegroup * 8;

    for (byte bit_pntr = 0; bit_pntr < 8; bit_pntr++)
    {
      if ( bitRead(temp, (7 - bit_pntr) + offset) == 1)
        bitSet(data1[bytegroup], (7 - bit_pntr));
    }
  }

  for (byte i = 0; i < 4; i++)
    dataj[i] = data1[i];

}


//-- Four_Bytes_2_Long -------------------------------------
// Creates an unsigned long from  4 bytes where A = MSB and
// D = LSB.  Based upon code by Mehrdad Nazmdar.
// Called by :
// Calls : N/A
// Returns :  unsigned long number - range 0 - 4294967295
//------------------------------------------------------------
unsigned long Four_Bytes_2_Long(byte A, byte B, byte C, byte D)
{
  uint8_t data[4];
  unsigned long testBigint;

  data[0] = D;  //LSB
  data[1] = C;
  data[2] = B;
  data[3] = A; //MSB

  testBigint = *(unsigned long*)(&data);

  return testBigint;
}
票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34121110

复制
相关文章

相似问题

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