Binary string isn't converting to decimal properly on my arduino : Basically I want to convert the binary string I store from my two interrupts (ISR_INT1, ISR_INT0) into a decimal. I've tested this using gcc on my mac and it works correctly giving me the correct decimal. Testing on my Arduino I get a totally different decimal. I know the arduino only goes up to 16 bit int so I used a long instead see below. Any help or suggestions are greatly appreciated. 


#Here is my Arduino Sketch 

    #define MAX_BITS 100                 // max number of bits 
    #define WEIGAND_WAIT_TIME  3000      // time to wait for another weigand pulse.  
    
    unsigned char databits[MAX_BITS];    // stores all of the data bits
    unsigned char bitCount;              // number of bits currently captured
    unsigned char flagDone;              // goes low when data is currently being captured
    unsigned int weigand_counter;        // countdown until we assume there are no more bits
    
    unsigned long facilityCode = 0;      // decoded facility code
    unsigned long cardCode = 0;          // decoded card code
    String fullCard;                     // binary value full card number
    
    int LED_GREEN = 11;
    int LED_RED = 12;
    int BEEP_BEEP = 10;
    
    // interrupt that happens when INTO goes low (0 bit)
    void ISR_INT0() {
      fullCard += 0;
      bitCount++;
      flagDone = 0;
      weigand_counter = WEIGAND_WAIT_TIME;
    
    }
    
    // interrupt that happens when INT1 goes low (1 bit)
    void ISR_INT1() {
      fullCard += 1;
      databits[bitCount] = 1;
      bitCount++;
      flagDone = 0;
      weigand_counter = WEIGAND_WAIT_TIME;
    }
    
    void setup() {
      pinMode(LED_RED, OUTPUT);
      pinMode(LED_GREEN, OUTPUT);
      pinMode(BEEP_BEEP, OUTPUT);
      digitalWrite(LED_RED, HIGH); // High = Off
      digitalWrite(BEEP_BEEP, HIGH); // High = off
      digitalWrite(LED_GREEN, LOW);  // Low = On
      pinMode(2, INPUT);     // DATA0 (INT0)
      pinMode(3, INPUT);     // DATA1 (INT1)
    
      Serial.begin(9600);
      Serial.println("Snow RFID Reader PUT HID CARD ");
    
      // binds the ISR functions to the falling edge of INTO and INT1
      attachInterrupt(0, ISR_INT0, FALLING);
      attachInterrupt(1, ISR_INT1, FALLING);
    
    
      weigand_counter = WEIGAND_WAIT_TIME;
    }
    
    
    
    
    void loop()
    {
      // This waits to make sure that there have been no more data pulses before processing data
      if (!flagDone) {
        if (--weigand_counter == 0)
          flagDone = 1;
      }
    
      // if we have bits and we the weigand counter went out
      if (bitCount > 0 && flagDone) {
        unsigned char i;
        Serial.print(" ");
        Serial.print("Read ");
        Serial.print(bitCount);
        Serial.print(" bits. ");
    
    
        //int temp_l = fullCard.length() + 1;
    
        //char temp[temp_l];
    
        //fullCard.toCharArray(temp, temp_l);
    
        Serial.print(fullCard);
    
        **// THIS IS WHERE IT I TRY TO CONVERT MY BINARY STRING INTO A DECIMAL**
    
        long fullCardInt = bin2dec(const_cast<char*>(fullCard.c_str()));
    
        Serial.print(fullCardInt);
    
        if (bitCount == 35) {
          // 35 bit HID Corporate 1000 format
          // facility code = bits 2 to 14
          for (i = 2; i < 14; i++) {
            facilityCode <<= 1;
            facilityCode |= databits[i];
          }
    
          // card code = bits 15 to 34
          for (i = 14; i < 34; i++) {
            cardCode <<= 1;
            cardCode |= databits[i];
          }
    
          printBits();
        }
        else if (bitCount == 26) {
          // standard 26 bit format
          // facility code = bits 2 to 9
          for (i = 1; i < 9; i++) {
            facilityCode <<= 1;
            facilityCode |= databits[i];
          }
    
          // card code = bits 10 to 23
          for (i = 9; i < 25; i++) {
            cardCode <<= 1;
            cardCode |= databits[i];
          }
    
          printBits();
        }
        else {
          Serial.println("Unable to decode.");
        }
    
        // cleanup and get ready for the next card
        bitCount = 0;
        facilityCode = 0;
        cardCode = 0;
        for (i = 0; i < MAX_BITS; i++)
        {
          databits[i] = 0;
        }
      }
    }
    
    void printBits() {
      Serial.print("FC = ");
      Serial.print(facilityCode);
      Serial.print(", CC = ");
      Serial.println(cardCode);
    
      digitalWrite(LED_RED, LOW); // Red
      if (cardCode == 12345) {
        digitalWrite(LED_GREEN, HIGH);
      }
      delay(500);
      digitalWrite(LED_RED, HIGH);
      digitalWrite(LED_GREEN, LOW);
    
      digitalWrite(BEEP_BEEP, LOW);
      delay(500);
      digitalWrite(BEEP_BEEP, HIGH);
      delay(500);
      digitalWrite(BEEP_BEEP, LOW);
      delay(500);
      digitalWrite(BEEP_BEEP, HIGH);
    }
    
    long bin2dec(const char *bin)
    {
      int result = 0;
      for (; *bin; bin++)
      {
        if ((*bin != '0') && (*bin != '1'))
          return -1;
        result = result * 2 + (*bin - '0');
        //if(result<=0) return -1;
      }
      return result;
    }

#This is what my serial terminal for my arduino reads out 

    Snow RFID Reader PUT HID CARD 
      
     // bits read         Binary string          Incorrect decimal
     Read 26 bits.   00001000000100000101010011      16723             FC = 16, CC = 8361


#Here is my Test.cpp script

    //THIS WORKS AND GIVES ME THE CORRECT DECIMAL

    #include <stdio.h>
    
    int bin2dec(const char *bin)
    {
      int result=0;
      for(;*bin;bin++)
      {
        if((*bin!='0')&&(*bin!='1'))
          return -1;
        result=result*2+(*bin-'0');
        //if(result<=0) return -1;
      }
      return result;
    }
    
    
    int main ( void )
    {
        printf("%d\n",bin2dec("00001000000100000101010011"));
        return(0);
    }

#This is what my test cpp script gives me which is correct.

    S:g$ g++ main.cpp -o SnowTest
    S:g$ ./SnowTest 
    2113875

