使用C中的strtoul函数将char hex string转换为unsigned int

时间:2017-05-22 12:07:55

标签: c strtoull

我想从ffffffff函数将hex转换为unsigned int。但我得到的输出为stdlib.h。 我使用过void main() { char str1[33] = "88CC6069E4EDF969773369F988CC969F"; unsigned int hex_int; hex_int = strtoul(str1, NULL, 16); //converting to unsigned int printf("%x\n", hex_int); } 库。 有人可以告诉我,我错了什么部分?

    //create "reference to your layout"
    LinearLayout yourFormLayout = FindViewById<LinearLayout(Resource.Id.Linear_MS);

    //create container for parameters
    var parameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent);

    //add some parameters
    param.SetMargins(20, 20, 20, 10);

    //create new element
    Button button = new Button(this);
        button.Text = "click me";
        button.SetBackgroundColor(Android.Graphics.Color.Black);
        button.SetTextColor(Android.Graphics.Color.White);
        button.LayoutParameters = parameters;

    //add some events to your element
    button.Click += (sender, e) => DoStuff();

        //Add the button
        yourFormLayout.AddView(button);

2 个答案:

答案 0 :(得分:1)

C11 7.22.1.4p8

  

strtolstrtollstrtoulstrtoull函数返回转换后的值(如果有)。如果无法执行转换,则返回零。 如果正确的值超出了可表示值的范围,LONG_MINLONG_MAXLLONG_MINLLONG_MAXULONG_MAX或{{1}返回(根据返回类型和值的符号,如果有的话),,宏ULLONG_MAX的值存储在ERANGE

请尝试以下代码:

errno

在我的机器上输出

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char str1[] = "88CC6069E4EDF969773369F988CC969F";
    errno = 0; // must reset errno first, otherwise it can retain an old value
    unsigned long int hex_int = strtoul(str1, NULL, 16); 
    if (errno != 0) {
        perror("strtoul failed:");
    }
}

你犯了2个错误: strtoul failed: Numerical result out of range 返回的值是strtoul unsigned ;即使这样,你的值也是128位,大于任何公共平台上的long

而且,不要限制unsigned long的长度 - 它应该至少33个字符;或者使用指向char的指针:

str1

而且,char *str1 = "88CC6069E4EDF969773369F988CC969F";

答案 1 :(得分:0)

另一个手册版本:

#include <ctype.h> // To use isdigit(), this function is not necessary if you can use ASCII table

const int asciiNumberBetweenDigitAndAlpha = 7; // see ASCII table
int str2[32];
const int size = sizeof(str1);

for (int i = 0; i < size - 1; i++)
{
    if (isdigit(readLine[i]))
        str2[i] = str1[i] - '0'; // In ASCII '0' = 48; '1' = 49..
    else
        str2[i] = str1[i] - '0' - asciiNumberBetweenDigitAndAlpha;
}

你可以使用,作为丑陋else部分的替代品:

if (str1[i] == 'A')
   str2[i] = 10;
else if (str1[i] == 'B')
   str2[i] = 11;
...