C语言 十进制整数字符串转十六进制字符串
【问题描述】
例如:输入字符串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语言 十进制整数字符串转十六进制字符串相关推荐
- python计算十进制和十六进制之和_计算十进制整数 678 和十六进制整数 0x12fd 之和是...
[填空题]计算十进制整数 678 和十六进制整数 0x12fd 之和是 . [填空题]物联网是将( )与( )连接起来并进行信息通信的网络. [简答题]C'est un arbre. [单选题]LED ...
- python 字符串转为十六进制字符串
python 字符串转为十六进制字符串 0x00 问题 0x01 解决 0x02 代码 0x00 问题 我们的字符串为:hexstring = "c0a80a010f27d21e3ee5d0 ...
- 十六进制字符串转Python代码(utf-8字符串转十六进制字符串)
Python 官网:https://www.python.org/ Free:大咖免费"圣经"教程< python 完全自学教程>,不仅仅是基础那么简单-- My CS ...
- JS 十六进制字符串转十六进制字符串数组以及字节数组
JS 十六进制字符串转十六进制字符串数组以及字节数组 //十六进制字符串转换为数组 function hexStringToArray(str) {var pos = 0;var len = str. ...
- 字符串转换十六进制字符串
字符串转换十六进制字符串 今天分享一个字符串转换十六进制字符串的C++代码. 以下是代码: /*** #purpose : 字符串转十六进制字符串* #note : 可用于汉字字符串* #param ...
- C语言十进制,八进制,十六进制输出分析
C语言可以使用三种数制表示数字,十进制,八进制,十六进制. 八进制以0开头,十六进制以0X或0x开头,即使你使用%d打印,编译器也会认为你输入的是八进制. 比如我们输入020. int x=020; ...
- 十进制字符串转十六进制字符串
NSString *colorStr=[self.model.sclass_color substringFromIndex:1]; unsigned long cor = strtoul([colo ...
- python3 字符串、十六进制字符串、数字、字节之间的转换
字节转16进制的字符串 'S'对应的16进制数是 0X53 字节转数字 0x53 对应的十进制数是 83 16进制字符串转数字 0x53 对应的十进制数是 83 字符串转字节 字节转字符串 内容不变, ...
- java 二进制转换成十六进制字符串_将二进制字符串转换为十六进制字符串JAVA
如果您不必自己实现该转换,则可以使用现有代码: int decimal = Integer.parseInt(binaryStr,2); String hexStr = Integer.toStrin ...
最新文章
- 【FFmpeg】结构体详解(一):AVCodec、AVCodecContext、AVCodecParserContext、AVFrame、AVFormatContext 、AVIOContext
- winform chart 添加数据报错_C# win Form开发 构造指定格式数据表字段值
- 用django将数据从数据库提出并分页展示
- python核心装饰_Python核心编程 | 装饰器
- SharePoint 使用代码创建 SPWeb/SPSiite/SPWebApplication以及WebPart添加到页面与删除 (一)...
- IDFA的值什么时候会发生改变
- mysql修改级联表数据_MySQL数据库 外键,级联, 修改表的操作
- npm install 报错(npm ERR! errno -4048,Error: EPERM: operation not permitted,)解决方法
- java数组及循环专题练习(使用数组和循环结构实现一个简易的功能完善的订餐系统)
- 如何申请电子邮箱,怎样注册163邮箱
- 黑客是怎样入侵你的网站的
- android 音乐柱状图动画,android 音乐播放柱形图
- 微信小程序接入环信客服
- 快速集成百度定位功能
- mac charles网页代理https使用笔记
- VSCode图片预览插件 Image preview
- oracle ebs 请求 待定,EBS 并发请求 计划 fnd_conc_release_classes(示例代码)
- python新闻爬虫系统的功能_基于Scrapy框架的Python新闻爬虫
- 超声波模块STM32F1X开发
- 简单的数值 variant
热门文章
- 感谢有你 | LiveVideoStackCon 2020 北京站优秀出品人、讲师与志愿者
- 设计模式C++实现(7)——观察者模式
- 大牛书单 | 腾讯运维大咖陪你过724
- 即将直播:新一代大数据技术构建PB级云端数仓实践
- 如何理解卷积神经网络(CNN)中的卷积和池化?
- win10下cmd ping不通虚拟机,xshell连不上虚拟机【如果实在想不出来原因,就看看吧】
- hdfs中一个block块默认多大?
- leetcode 688. Knight Probability in Chessboard | 688. “马”在棋盘上的概率(dp,记忆化搜索)
- leetcode 235. Lowest Common Ancestor of a Binary Search Tree | 235. 二叉搜索树的最近公共祖先(哈希表)
- 【Java】什么是CAS、synchronized升级概述、偏向锁/轻量级锁详解 - 笔记