C/C++ —— 十六进制类型字符串的转换

本文介绍了一种将十六进制字符串转换为短整型数据(shortint)的方法,并提供了两个具体的实现函数。通过示例展示了如何将字符串1A4e转换为0x1A4e的shortint数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    在实际工作中,字符串和其它数据类型的转换是很常见的,库函数有很多,比如 atoi , strtol ,sscanf 等,这些函数网上有很多资料,

我经常用到的就是十六进制的数值以字符串的形式传输,然后又要解析,这里记录一下我这边的做法:

将2个字节的十六进制的字符串转成short int 2个字节的整形数据: 


                                                                  撰写不易,转载请注明出处:http://blog.youkuaiyun.com/jscese/article/details/39054969

 

short int xstrtoshortint(char *str)
{       
//int len=strlen(str);
    short int ivalue = 0;   //这里转换为2个字节的整形数

    if((len/2)>sizeof(ivalue))
    {
        printf("left overflow \n");//会左溢出
    }
    int ioffset = 0;  //移位
    char *ptr; //字符指针
    ptr = str; //从头开始
    while (*ptr != '\0')  //到最后为字符串结束符
    {
        ivalue = ivalue << ioffset; //第一次不移位,之后每次左移4bit,十六进制一个字符代表4bit
        if ((*ptr <= '9' && *ptr >= '0'))
        {
            ivalue = ivalue + (*ptr - '0');//ASCALL 码相减
        }
        else if ((*ptr >= 'a' && *ptr <= 'f'))
        {
            ivalue = ivalue + (*ptr - 'a') + 10;
        }
        else if ((*ptr >= 'A' && *ptr <= 'F'))
        {
            ivalue = ivalue + (*ptr - 'A') + 10;
        }   // 给ivalue低位4bit 赋值
        ptr++;
        ioffset = 4;
    }
    return ivalue;
}


也可以这样,原理是一样的,只是换一种方式:


short int xstrtoshortint(char *str)
{
    int len = strlen(str);
    short int ivalue = 0;
    for (int i = 0; i < len; i++)
    {
        if ((str[i] <= '9' && str[i] >= '0'))
        {
            ivalue = ivalue * 16 + (str[i] - '0'); //16进制 可换其它进制
        }
        else if ((str[i] >= 'a' && str[i] <= 'f'))
        {
            ivalue = ivalue * 16 + (str[i] - 'a') + 10;
        }
        else if ((str[i] >= 'A' && str[i] <= 'F'))
        {
            ivalue = ivalue * 16 + (str[i] - 'A') + 10;
        }

    }
    return ivalue;
}



比如 调用xstrtoshortint("1A4e"),可以得到一个 0x1A4e 的short int 数据, 如果要转其它数据类型,原理相似!

转字符串的话,sprintf函数是最常用的!





### 将十六进制字符串转换为十进制整数 在不同编程语言中,将十六进制字符串转换为十进制整数的方式有所不同。以下是几种常见编程语言的具体实现。 #### Java 实现 Java 提供了内置方法 `Integer.parseInt` 来完成这一操作。该方法接受两个参数:待解析的字符串以及基数(对于十六进制而言,基数应设为 16)。下面是一个完整的代码示例: ```java public class HexToDecimal { public static void main(String[] args) { String hexString = "FF"; // 示例十六进制字符串 try { int decimalValue = Integer.parseInt(hexString, 16); // 转换为十进制 System.out.println("十六进制字符串 '" + hexString + "' 对应的十进制数值为:" + decimalValue); } catch (NumberFormatException e) { System.err.println("非法的十六进制字符串!"); } } } ``` 这种方法能够有效验证输入字符串是否合法并执行转换[^1]。 --- #### C++ 实现 C++ 可以利用标准库中的流操作符或者函数来完成类似的转换。以下是一段基于 `std::stoi` 的代码示例: ```cpp #include <iostream> #include <string> int main() { std::string hexString = "FF"; // 示例十六进制字符串 try { int decimalValue = std::stoi(hexString, nullptr, 16); // 基数设置为16 std::cout << "十六进制字符串 '" << hexString << "' 对应的十进制数值为:" << decimalValue << std::endl; } catch (const std::invalid_argument& ia) { std::cerr << "非法的十六进制字符串!" << std::endl; } return 0; } ``` 这段代码展示了如何使用现代 C++ 特性安全地进行转换[^2]。 --- #### C# 实现 C# 提供了一个简洁的方法——`Convert.ToInt32`,可以直接用于将十六进制字符串转换为十进制整数。下面是具体的代码示例: ```csharp using System; class Program { static void Main() { string hexString = "FF"; // 示例十六进制字符串 try { int decimalValue = Convert.ToInt32(hexString, 16); // 基数为16 Console.WriteLine($"十六进制字符串 '{hexString}' 对应的十进制数值为:{decimalValue}"); } catch (FormatException) { Console.Error.WriteLine("非法的十六进制字符串!"); } } } ``` 这种方式不仅高效而且易于理解和维护[^3]。 --- #### Python 实现 Python 是一种语法简洁的语言,在处理此类问题时尤为方便。可以通过内置函数 `int()` 并指定基数为 16 完成转换: ```python hex_string = "FF" # 示例十六进制字符串 try: decimal_value = int(hex_string, 16) # 转换为十进制 print(f"十六进制字符串 '{hex_string}' 对应的十进制数值为:{decimal_value}") except ValueError: print("非法的十六进制字符串!") ``` 这种做法同样支持错误检测机制,确保程序运行的安全性和稳定性[^4]。 --- #### C 实现 在 C 语言中,可以自定义一个函数来完成十六进制到十进制转换。例如,通过遍历字符串每一位字符逐步累加计算最终结果。这里提供一段参考代码: ```c #include <stdio.h> #include <ctype.h> // 自定义 htoi 函数 int htoi(const char s[]) { int i = 0, n = 0; while (s[i]) { if ('0' <= s[i] && s[i] <= '9') { n = 16 * n + (s[i] - '0'); } else if ('a' <= tolower(s[i]) && tolower(s[i]) <= 'f') { n = 16 * n + (tolower(s[i]) - 'a' + 10); } else { printf("非法字符:%c\n", s[i]); return -1; // 返回错误标志 } ++i; } return n; } int main(void) { const char* hexString = "FF"; int result = htoi(hexString); if (result != -1) { printf("十六进制字符串 '%s' 对应的十进制数值为:%d\n", hexString, result); } return 0; } ``` 此方案适用于需要完全控制底层逻辑的情况[^5]。 --- ### 总结 无论采用哪种编程语言,核心思路都是先确认输入的有效性再依据特定算法或工具将其映射至目标数值体系之中。每种语言都有各自的优劣之处,开发者可根据实际需求灵活选用合适的技术手段。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值