如何将String转换为HEX或二进制或十进制

时间:2016-03-21 01:51:47

标签: c string binary hex

我有一个类似于“10100010”的字符串,它等于162十进制或0xA2十六进制。我需要找到一种方法来计算C中的其中一个值。或者只是一种在C中获得此值的方法:0b(字符串) - 0b10100010

我试图通过这样做将每个位(char)转换为int:String [0] - '0',并使用循环来mannualy计算二进制数的值,类似这样,但它没有工作..

for (i=0,n=n_c; i<n_c; i++,n--)
{
    decimal_value=decimal_value+ pow( (val[i]-'0') , (n-1) );

    printf("%d ",  pow( (int) ((val[i]-'0')) , (n-1)));
}

在这种特殊情况下n_c = 6(6位)。如果字符串大于8位,我还有另一个问题,但现在让我们关注这个“简单”的情况。

你可以帮助我吗?

4 个答案:

答案 0 :(得分:2)

有一个bin to dec的例子:

{{1}}

输出:x = 100; y = 4; z = 17

答案 1 :(得分:0)

我认为使用位操作可能会让你获得更好的结果。

以下代码不是最优化的,也不是广告素材,但使用按位运算符(<<|)演示了直接解决问题的方法。

#include <stdio.h>

/*
  Returns the binary number found at the beginning of the string (if any).
  No error checks are performed
*/
unsigned long parse_binary_string(char* str) {
  unsigned long value = 0;
  while (1) {
    if (*str == '0')
      value = value << 1;
    else if (*str == '1')
      value = (value << 1) | 1;
    else
      break;
    str++;
  }
  return value;
}

int main(int argc, char const* argv[]) {
  char string[] = "01101010";
  printf("The result for %s is %lu\n", string, parse_binary_string(string));
  return 0;
}

答案 2 :(得分:0)

  

您的方法不起作用的原因是   1.您需要使用(i)* 2 ^(n-1)
  2.您使用错误的方式打印结果。

     

pow函数的定义是double pow(double x,double y);

Pls try this:
#include <stdio.h>
#include <math.h>
int main()
{
    int i = 0;
    int n_c = 6;
    char val[10]={'0','1','0','1','0','1','0',};
    double decimal_value = 0;
    int n;
    for (i=0,n=n_c; i<n_c; i++,n--)
    {   
        decimal_value=decimal_value+ pow( (val[i]-'0')*2 ,(n-1) );
        printf("%lf \n",  pow( (((val[i]-'0'))*2) , (n-1)));
    }   
    printf("%lf \n", decimal_value);
}

答案 3 :(得分:0)

最好使用strtol(),但如果你想推出自己的代码:

将一串基本N字符转换为整数以便遍历每个数字的简单方法,并将其添加到已乘以基数的总和中。

OP仍然需要添加一些代码并确定如何处理错误的输入。帮助你入门的东西。

// convert '0' --> 0, 'A' --> 10, 'z' --> 35, etc.
// return -1 on failure  
int covert_char_to_digit(char ch) {
  TBD code
}

int string_to_int(const char *s, int base) {
  if (test_if_valid_base(base)) {
    fprintf(stderr, "Invalid base %d\n", base);
    return 0;
  }
  int sum = 0;
  while (*s) {
    int ch = covert_char_to_digit(*s);
    if (ch < 0 || ch >= base) {
      fprintf(stderr, "Invalid digit\n");
      return 0;
    }

    // Does OP want to detect pending overflow
    // Here is a good place for such code.

    sum = sum*base + ch;
    s++;
  }
  return sum;
}