将二进制字符串转换为十进

时间:2018-01-10 18:12:51

标签: c++ arduino

我想将二进制的字符串转换为小数。

以下是fullCard值。

fullCard = "1000000100000101111101"

以下是转换为十进制后的样子

fullCardInt = 2113917

Main.ino

String fullCard;                     // binary value full card number 

int fullCardInt = bin2dec(const_cast<char*>(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;
}

2 个答案:

答案 0 :(得分:4)

1000000100000101111101有22位。

Arduino上的

int是16位。

解决方案是使用long(32位)而不是int

答案 1 :(得分:3)

因为这个功能是便携式的,你测试过吗?你有没有检查它是怎么回事?我们不是在这里进行代码审查,也不是调试代码。

#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("1000000100000101111101"));
    return(0);
}

结果我得到了2113917。

你的代码可以使用几个快捷方式,但功能上它是合理的。你没有告诉我们你是怎么称呼它的。

啊,是的,加上一个gre_gor的答案就是问题。

#include <stdio.h>

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 <stdio.h>

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的答案不是我的......