Я хотел бы преобразовать строку, которая является двоичной для десятичной.
Вот значение fullCard.
fullCard = "1000000100000101111101"
Вот как это должно выглядеть после преобразования в десятичную
fullCardInt = 2113917
Main.ino
String fullCard; // binary value full card number int fullCardInt = bin2dec(const_cast(fullCard.c_str())); // I get -1 which is a failure. serial.print(fullCardInt); 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; }
1000000100000101111101
имеет 22 бита.
int
на Arduino – 16 бит.
Решение заключается в использовании long
(32-разрядных) вместо int
.
так как эта функция переносима, вы ее протестировали? вы помогли понять, что происходит? Мы не находимся здесь для просмотра кода или для отладки кода.
#include 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("1000000100000101111101")); return(0); }
В результате я получаю 2113917.
ваш код может использовать пару ярлыков, но функционально это звук. вы не показали нам, как вы его назвали.
ahh yes, плюс один ответ gre_gor, который является проблемой.
#include short bin2dec(const char *bin) { short 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("1000000100000101111101")); return(0); }
результат -1, потому что у вас есть эта строка в нем
if(result<=0) return -1;
который ограничивает вас размером int - 1 бит. поэтому 15 для 16 бит int и 31 для 32 бит.
#include short bin2dec(const char *bin) { short result=0; for(;*bin;bin++) { if((*bin!='0')&&(*bin!='1')) { printf("here\n"); return -1; } result=result*2+(*bin-'0'); printf("0x%04X\n",result); if(result<=0) { printf("there\n"); return -1; } } return result; } int main ( void ) { printf("%d\n",bin2dec("1000000100000101111101")); return(0); } 0x0001 0x0002 0x0004 0x0008 0x0010 0x0020 0x0040 0x0081 0x0102 0x0204 0x0408 0x0810 0x1020 0x2041 0x4082 0xFFFF8105 there -1
помните, плюс один / принять ответ gre_gor не мой ...