【问题描述】
例如:输入字符串str1[]=“87632394”,需转成字符串str2[]=“5392A0A”

【解决方案】
方案1:
先使用strtol函数将字符串转成十进制数,再通过sprintf函数将十进制数按十六进制字符串形式输出到字符数组保存
该方案弊端:转换的数不能大于0x7FFFFFFF,因为strtol的返回值是long型

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main(void)
{char str1[] = "87632394";char str2[100] = {0};char* endptr;long data = 0;data = strtol(str1,&endptr,10);printf("data=%ld\r\n",data);sprintf(str2,"%X",data);printf("str2=%s\r\n",str2);return 0;
}

运行结果:

方案2:
解决当要转换的值大于0x7FFFFFFF,如何处理
例如:输入str1[]="86281102005404”,需转成str2[]=“4E78E26F949C”
首先要解决的是如何把"86281102005404”转成数字保存
借atol函数的理念来自己实现一个

#include <stdio.h>typedef enum { FALSE = 0, TRUE = !FALSE } BOOL;
__int64 my_atoll(char* str)//__int64可以改成long long,VC++6.0不支持long long,C99中才添加long long
{__int64 s = 0;BOOL isMinus = FALSE;//负while (*str == ' ')//跳过空格{str++;}if (*str == '+' || *str == '-'){if (*str == '-')isMinus = TRUE;str++;}else if (*str < '0' || *str > '9')//如果第1位既不是符号也不是数字,直接返回异常值return 0;while (*str != '\0' && *str >= '0' && *str <= '9'){s = s * 10 + *str - '0';str++;}return s * (isMinus ? -1 : 1);
}//测试
int main(void)
{char str[] = "86281102005404";printf("str=%lld\r\n", my_atoll(str));return 0;
}

已验证:(以上代码在VS2019上运行测试,在VC++6.0上不支持%lld打印)

然后要把数字转成十六进制字符,依然可以使用sprintf

#include <stdio.h>typedef enum { FALSE = 0, TRUE = !FALSE } BOOL;
__int64 my_atoll(char* str)
{__int64 s = 0;BOOL isMinus = FALSE;//负while (*str == ' ')//跳过空格{str++;}if (*str == '+' || *str == '-'){if (*str == '-')isMinus = TRUE;str++;}else if (*str < '0' || *str > '9')//如果第1位既不是符号也不是数字,直接返回异常值return 0;while (*str != '\0' && *str >= '0' && *str <= '9'){s = s * 10 + *str - '0';str++;}return s * (isMinus ? -1 : 1);
}int main(void)
{char str[] = "86277343909020";char strhex[100] = {0};long long data=0;data = my_atoll(str);printf("str=%lld\r\n",data);if(data>0xFFFFFFFF){sprintf(strhex,"%X%08X", (unsigned int)(data>>32), (unsigned int)data);}else{sprintf(strhex,"%X", (unsigned int)data);}printf("strhex=%s\r\n",strhex);return 0;
}

运行结果:

注意,当数据大于0xFFFFFFFF,sprintf中%08X是必要的,不要写成%X,因为0需要打出来。

方案三:
接上面的方案二,my_atoll还是要用,只是将数字转成十六进制字符串可以自己实现。

void ltoh(long long x, char* p)
{int div;int cnt = 0;if (x == 0) {*p = '0';}if (x < 0) {x = -x;*p = '-';p++;}for (int i = 0; x != 0; i++) {div = x % 16;x = x / 16;if ((div - 10) < 0)*(p + i) = div + '0';else *(p + i) = 'A' + div - 10;div = 0;cnt++;}//reverse颠倒for (int i = 0; i < cnt / 2; i++) {char temp = p[i];p[i] = p[cnt - 1 - i];p[cnt - 1 - i] = temp;}
}int main(void)
{char str[] = "86281102005404";char strhex[100] = { 0 };long long data = 0;data = my_atoll(str);printf("str=%lld\r\n", data);ltoh(data,strhex);printf("strhex=%s\r\n", strhex);return 0;
}

my_atoll函数见方案二。
运行结果:

如果比0xFFFF FFFF FFFF FFFF更大的数要转成十六进制字符串,就不在这里讨论了

PS.
vc++6.0由于版本过于陈旧,不支持long long,可以改用__int64来定义
报错:error C2632: ‘long’ followed by ‘long’ is illegal
微软最终在Visual Studio 2013上增加了对long long和unsigned long long的支持。

C语言 十进制整数字符串转十六进制字符串相关推荐

  1. python计算十进制和十六进制之和_计算十进制整数 678 和十六进制整数 0x12fd 之和是...

    [填空题]计算十进制整数 678 和十六进制整数 0x12fd 之和是 . [填空题]物联网是将( )与( )连接起来并进行信息通信的网络. [简答题]C'est un arbre. [单选题]LED ...

  2. python 字符串转为十六进制字符串

    python 字符串转为十六进制字符串 0x00 问题 0x01 解决 0x02 代码 0x00 问题 我们的字符串为:hexstring = "c0a80a010f27d21e3ee5d0 ...

  3. 十六进制字符串转Python代码(utf-8字符串转十六进制字符串)

    Python 官网:https://www.python.org/ Free:大咖免费"圣经"教程< python 完全自学教程>,不仅仅是基础那么简单-- My CS ...

  4. JS 十六进制字符串转十六进制字符串数组以及字节数组

    JS 十六进制字符串转十六进制字符串数组以及字节数组 //十六进制字符串转换为数组 function hexStringToArray(str) {var pos = 0;var len = str. ...

  5. 字符串转换十六进制字符串

    字符串转换十六进制字符串 今天分享一个字符串转换十六进制字符串的C++代码. 以下是代码: /*** #purpose : 字符串转十六进制字符串* #note : 可用于汉字字符串* #param ...

  6. C语言十进制,八进制,十六进制输出分析

    C语言可以使用三种数制表示数字,十进制,八进制,十六进制. 八进制以0开头,十六进制以0X或0x开头,即使你使用%d打印,编译器也会认为你输入的是八进制. 比如我们输入020. int x=020; ...

  7. 十进制字符串转十六进制字符串

    NSString *colorStr=[self.model.sclass_color substringFromIndex:1]; unsigned long cor = strtoul([colo ...

  8. python3 字符串、十六进制字符串、数字、字节之间的转换

    字节转16进制的字符串 'S'对应的16进制数是 0X53 字节转数字 0x53 对应的十进制数是 83 16进制字符串转数字 0x53 对应的十进制数是 83 字符串转字节 字节转字符串 内容不变, ...

  9. java 二进制转换成十六进制字符串_将二进制字符串转换为十六进制字符串JAVA

    如果您不必自己实现该转换,则可以使用现有代码: int decimal = Integer.parseInt(binaryStr,2); String hexStr = Integer.toStrin ...

最新文章

  1. 【FFmpeg】结构体详解(一):AVCodec、AVCodecContext、AVCodecParserContext、AVFrame、AVFormatContext 、AVIOContext
  2. winform chart 添加数据报错_C# win Form开发 构造指定格式数据表字段值
  3. 用django将数据从数据库提出并分页展示
  4. python核心装饰_Python核心编程 | 装饰器
  5. SharePoint 使用代码创建 SPWeb/SPSiite/SPWebApplication以及WebPart添加到页面与删除 (一)...
  6. IDFA的值什么时候会发生改变
  7. mysql修改级联表数据_MySQL数据库 外键,级联, 修改表的操作
  8. npm install 报错(npm ERR! errno -4048,Error: EPERM: operation not permitted,)解决方法
  9. java数组及循环专题练习(使用数组和循环结构实现一个简易的功能完善的订餐系统)
  10. 如何申请电子邮箱,怎样注册163邮箱
  11. 黑客是怎样入侵你的网站的
  12. android 音乐柱状图动画,android 音乐播放柱形图
  13. 微信小程序接入环信客服
  14. 快速集成百度定位功能
  15. mac charles网页代理https使用笔记
  16. VSCode图片预览插件 Image preview
  17. oracle ebs 请求 待定,EBS 并发请求 计划 fnd_conc_release_classes(示例代码)
  18. python新闻爬虫系统的功能_基于Scrapy框架的Python新闻爬虫
  19. 超声波模块STM32F1X开发
  20. 简单的数值 variant

热门文章

  1. 感谢有你 | LiveVideoStackCon 2020 北京站优秀出品人、讲师与志愿者
  2. 设计模式C++实现(7)——观察者模式
  3. 大牛书单 | 腾讯运维大咖陪你过724
  4. 即将直播:新一代大数据技术构建PB级云端数仓实践
  5. 如何理解卷积神经网络(CNN)中的卷积和池化?
  6. win10下cmd ping不通虚拟机,xshell连不上虚拟机【如果实在想不出来原因,就看看吧】
  7. hdfs中一个block块默认多大?
  8. leetcode 688. Knight Probability in Chessboard | 688. “马”在棋盘上的概率(dp,记忆化搜索)
  9. leetcode 235. Lowest Common Ancestor of a Binary Search Tree | 235. 二叉搜索树的最近公共祖先(哈希表)
  10. 【Java】什么是CAS、synchronized升级概述、偏向锁/轻量级锁详解 - 笔记