C++ 将十六进制或十进制字符串转换为C+中的long-long+;

C++ 将十六进制或十进制字符串转换为C+中的long-long+;,c++,binary,hex,long-integer,C++,Binary,Hex,Long Integer,我有一个处理字符串的代码,比如“19485”或“10011010”或“AF294EC” long-long-toDecimalFromString(字符串值,格式){ 长dec=0; 对于(int i=value.size()-1;i>=0;i--){ char ch=在(i)处的值; int val=int(ch); 如果(ch>='0'&&ch如果不处理减号,它将不会处理自身。 检查它,记住你所看到的事实。然后,在 结尾,如果您看到一个'-'作为第一个字符,则取否定 结果 其他要点: 您不

我有一个处理字符串的代码,比如“19485”或“10011010”或“AF294EC”

long-long-toDecimalFromString(字符串值,格式){
长dec=0;
对于(int i=value.size()-1;i>=0;i--){
char ch=在(i)处的值;
int val=int(ch);

如果(ch>='0'&&ch如果不处理减号,它将不会处理自身。 检查它,记住你所看到的事实。然后,在 结尾,如果您看到一个
'-'
作为第一个字符,则取否定 结果

其他要点:

  • 您不需要(也不想)使用
    pow
    :它只是
    results=格式*结果+数字
    每次通过
  • 您确实需要验证您的输入,确保数字 您获得的在基地是合法的(并且您没有任何 其他奇数字符)
  • 您还需要检查溢出
  • 您应该使用
    isdigit
    isalpha
    (或
    islower
    isupper
    )用于字符检查
  • 您应该使用例如
    val-=“0”
    (而不是
    48
    )作为您的 从字符代码到数字值的转换
  • 您应该使用
    [i]
    ,而不是(i)
处的
来阅读个人信息
字符。使用常用的开发选项编译,以及
如果发生错误,您将得到崩溃,而不是异常
  • 但您可能应该使用迭代器,而不是索引 通过字符串。它更地道
  • 您几乎可以肯定地接受大小写 对于字母,也可能跳过前导空格
  • 从技术上讲,也不能保证字母 角色是有序的,相邻的。实际上,我想你 可以将其用于
    'A'-'F'
    范围内的字符(或
    'a'-'f'
    ,但这是将字符转换为数字的最可靠的方法
    是使用表查找。

    您需要知道指定的数字是被解释为有符号的还是无符号的(换句话说,是“ffffffff”-1还是4294967295?)。 如果有符号,则要检测负数,请测试最高有效位。如果设置了ms位,则在按照您的方式转换数字(生成无符号值)后,取1的补码(按位求反,然后添加1)

    注意:要测试ms位,您不能只测试前导字符。如果数字是有符号的,“ff”应该是-1还是255?。您需要知道预期结果的大小(如果是32位有符号的,那么“FFFFFF”是负数,或者-1。但是如果是64位有符号的,“ffffffff”是正数,或者是4294967295)。因此,“ffffffff”的例子有不止一个正确答案

    您可以只测试无符号结果是否大于结果范围的“中间点”(例如,32位数字为2^31-1),而不是测试ms位

    long long toDecimalFromString(string value, Format format){
        long long dec = 0;
        for (int i = value.size() - 1; i >= 0; i--) {
            char ch = value.at(i);
            int val = int(ch);
            if (ch >= '0' && ch <= '9') {
                val = val - 48;
            } else {
                val = val - 55;
            }
            dec = dec + val * (long long)(pow((int) format, (value.size() - 1) - i));
        }
        return dec;
    }