C/C++
2021/9/12 11:36:07
本文主要是介绍C/C++,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
十六进制和ASCII码的相互转换
前言
最近在做一些C语言的笔试练习题,其中有一个题目如下:
- 十六进制的ASCII字符串如"0x1A"转换成十六进制的0x1A整数
- 输入一个整数,如0x12转换成ASCII字符串的"0x12"
1、ASCII码转换成十六进制整数输出
1.1 具体思想:
输入的ASCII码字符串的前两字节分别是十六进制的前缀’0’和’x’,所以在处理时,要注意,接着再对十六进制前缀后面的部分进行转换,具体步骤分为如下几步:
① 计算ASCII码字符串的长度
② 分离出ASCII字符串中的十六进制前缀
③ 将ASCII字符串中的0-9的ASCII字符转换成十进制整数
④ 将ASCII字符串中的A-F或a-f转换成十进制整数
⑤ 以上转换过程中要注意十六进制数每个位的权重,如个位是160,十位是161
1.2 代码实现:
int asciiToHex(char* str) { size_t i = 0; //测量ASCII字符串的长度 size_t temp = 0; int base = 0; //基数权重 i = strlen(str); /*while (str[i]) { i++; }*/ //识别出字符串中的十六进制前缀 if ((str[0] == '0') && (str[1] == 'x')) { str += 2; i -= 2; } //按照***从右到左***的顺序进行转换 for (size_t j = 0; j < i; j++) { //计算每次循环分离数的权重 base = pow(16, (i - j - 1)); //分离出字符串中的 0-9 if (str[j] >= 48 && str[j] <= 57) { temp += base * (str[j] - '0'); } //分离出字符串中的 A-F else if (str[j] >= 65 && str[j] <= 90) { temp += base * (str[j] - 'A'+10); } //分离出字符串中的 a-f else if (str[j] >= 97 && str[j] <= 122) { temp += base * (str[j] - 'a' + 10); } //printf("j= %d ,temp=%ld\r\n", j, temp); } return temp; }
2、十六进制整数转换成ASCII码z字符串输出
2.1 具体思想
① 仅对符合size_t的整数进行转换(介绍思想)
② size_t的类型在本人电脑上定义为32位的unsigned int
③ 不管是十进制还是十六进制,在内存中都是以二进制存储,以此为切入点,当输入size_t的32位整数时, 先分离低四位,最后分离到高四位(刚好在十六进制的0-F范围内)。总共可以分离出8个数,并放入数组中。
④ 对③所述的整数数组按照顺序从高到低进行遍历,找出来第一个不为0的位置开始转换(防止转换出的结果为’0x0000001A’)。
2.2 代码实现
char* hexToAscii(size_t hex,char *str_hex) { unsigned char temp[8]; unsigned char j = 2; //循环转换ASCII,前两位被十六进制前缀'0x'占用 char i = 0; //循环变量i必须定义为有符号型,否则会自减溢出 str_hex[0] = '0', str_hex[1] = 'x'; for (i = 0; i < 8; i++) { //循环依次分离 temp[i] = (hex >> (i * 4)) & 0xF; } for (i = 7; i >=0; i--) { if (temp[i]) { //找出第一个不为零的位置开始转换 while (i >= 0) { if (temp[i] < 10) { str_hex[j] = temp[i] + '0'; } else { str_hex[j] = temp[i] -10 + 'A'; } i--; j++; } str_hex[j] = NULL; //令转换后的ASCII字符串以空字符结尾 break; } } }
3 主函数验证
3.1 主函数部分代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> int main(void) { char *str = "0xabcd123"; int num = 0; char strHex[10]; //char strHex[10] = " "; size_t hexNum = 0x456AB; num = asciiToHex(str); printf("0x%x\r\n", num); hexToAscii(hexNum, strHex); printf("hexNum = 0x%x\r\n",hexNum); printf("hexToAscii: %s\r\n",strHex); return 0; }
3.2 运行环境
- CPU-x64
- Win10
- Visual Studio 2019
3.3 运行结果
4 结束语
以上只是本人的想法,操作的时候注意C语言中的字符串注意事项
PS:由“阿拉如爷”赞助,喜欢的点个赞~哈哈ψ(`∇´)ψ
这篇关于C/C++的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11国产医疗级心电ECG采集处理模块
- 2025-01-10Rakuten 乐天积分系统从 Cassandra 到 TiDB 的选型与实战
- 2025-01-09CMS内容管理系统是什么?如何选择适合你的平台?
- 2025-01-08CCPM如何缩短项目周期并降低风险?
- 2025-01-08Omnivore 替代品 Readeck 安装与使用教程
- 2025-01-07Cursor 收费太贵?3分钟教你接入超低价 DeepSeek-V3,代码质量逼近 Claude 3.5
- 2025-01-06PingCAP 连续两年入选 Gartner 云数据库管理系统魔力象限“荣誉提及”
- 2025-01-05Easysearch 可搜索快照功能,看这篇就够了
- 2025-01-04BOT+EPC模式在基础设施项目中的应用与优势
- 2025-01-03用LangChain构建会检索和搜索的智能聊天机器人指南