c++ - Arduino त्रुटि पर लंबे समय तक 4 बाइट्स कन्वर्ट करें




type-conversion (2)

मुझे वास्तव में अजीब असंगति है
मैं Arduino पर बाइनरी फ़ाइलों से पढ़ने के लिए तैयारी कर रहा हूँ (एक मिडी खिलाड़ी के लिए, यदि आप रुचि रखते हैं)। अगर मैं अरडिनो पर 4 बाइट्स को लंबे समय तक संयोजित करने की कोशिश करता हूं, तो मुझे गलत परिणाम देता है
हालांकि, अगर मैं पीसी पर समकक्ष कोड का उपयोग करता हूं, तो मुझे सही मान मिलता है।

इनपुट है: 0x12481248 (0x12, 0x48, 0x12, 0x48) (वास्तव में एक यादृच्छिक संख्या)।

Arduino देता है: 4680

कोड :: ब्लॉक दिए गए: 306713160

4680 0x1248 के समान है, और परिणाम है जब आप Arduino (2 छोड़े बाइट्स) पर लंबे समय के बजाय एक int का उपयोग करते हैं।

Arduino कोड:

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 यह दिखा रहा है कि यह सीरियल के कारण नहीं है। println () सीरियल मॉनिटर आउटपुट वास्तव में है:

4680

306713160

सी ++ कोड:

#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 पुस्तकालय के साथ बाइट्स को परिवर्तित करने का एक बेहतर / सुंदर तरीका जानता है?


Arduino पर, int साइज 16 बीट्स है

इस पंक्ति में:

unsigned long testint = read1<<24|read2<<16|read3<<8|read4;

भले ही परिणाम एक unsigned long (32 बिट) में जमा हो जाए, तो बीटावर्ड ऑपरेशन int एस पर किया जाता है।

इस लाइन को इस पर बदलें:

unsigned long testint = (unsigned long)read1 << 24 
                      | (unsigned long)read2 << 16
                      | (unsigned long)read3 << 8
                      | (unsigned long)read4;

आप निम्न कोड का भी उपयोग कर सकते हैं:

uint8_t data[4];
data[0]=read4;
data[1]=read3;
data[2]=read2;
data[3]=read1;
unsigned long testint =*(unsigned long*)(&data);




type-conversion