C语言16进制字符串转数字
假设有一个十六进制字符串,“99AD1B5226A37E3E058E3B8E27C2C666”,如何把它按照字节来切分,然后转成整型?也就是说转换成 0x99, 0xAD, 0x1B, …
代码实现
C 语言参考代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>char *key = "99AD1B5226A37E3E058E3B8E27C2C666";
void main(void)
{if(strlen(key) & 1){printf("key 的长度是奇数!");return;}char byte[3] = {0};char *p = key;char *endptr;unsigned int res;for(int i = 0; i < strlen(key); i += 2){memcpy(byte, &key[i], 2);res = strtol(byte, &endptr, 16);printf("%02x ", res);}printf("\n");
}
测试结果:
99 ad 1b 52 26 a3 7e 3e 05 8e 3b 8e 27 c2 c6 66
说明:
- 代码中要求待转换字符串的长度是偶数,如果是奇数,可以手动补零
- 用到的关键函数是 strtol,它的原型是
long int strtol (const char* str, char** endptr, int base);
strtol 介绍
long int strtol (const char* str, char** endptr, int base);
【参数说明】
str 为要转换的字符串,endstr 为第一个不能转换的字符的指针,base 为字符串 str 所采用的进制。
【函数说明】
strtol() 会扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(’\0’)结束转换,并将结果返回。
两点注意:
- 当 base 的值为 0 时,默认采用 10 进制转换,但如果遇到 ‘0x’ / ‘0X’ 前置字符则会使用 16 进制转换,遇到 ‘0’ 前置字符则会使用 8 进制转换。
- 若endptr 不为NULL,则会将遇到的不符合条件而终止的字符指针由 endptr 传回;若 endptr 为 NULL,则表示该参数无效,或不使用该参数。
【返回值】
返回转换后的长整型数;如果不能转换或者 str 为空字符串,那么返回 0(0L);如果转换得到的值超出 long int 所能表示的范围,函数将返回 LONG_MAX 或 LONG_MIN(在 limits.h 头文件中定义),并将 errno 的值设置为 ERANGE。
代码重构
为了方便使用,可以把这个小功能提炼成一个函数,我给它起名为 hex_string_to_u8。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef unsigned char u8;int hex_string_to_u8(const char *hex_str, char *out)
{if(strlen(hex_str) & 1){printf("字符串的长度是奇数!");return -1;}char byte[3] = {0};const char *p = hex_str;int j = 0;for(int i=0; i<strlen(hex_str); i+=2){memcpy(byte, &p[i], 2);out[j++] = strtol(byte, NULL, 16);} return 0;
}void hexdump(void *data, int size){if (size <= 0) return;int i;for (i=0; i<size;i++){printf("%02X ", ((u8 *)data)[i]);}printf("\n");
}void main(void)
{char *key = "99AD1B5226A37E3E058E3B8E27C2C666";char res[16] = {0};hex_string_to_u8(key, res);hexdump(res, 16);
}
参考资料:
C语言strtol()函数:将字符串转换成long(长整型数)_C语言中文网
C语言16进制字符串转数字相关推荐
- C语言之10/16进制字符串和数字转换(四)
#include <stdio.h> #include <stdlib.h>int main() {//1.将10进制和16进制字符串转换成数字char a[] = " ...
- c语言16进制字符串型转整形,c语言htoi() --将16进制数组成的字符串转换成整型
k&r习题,将16进制数(可选0x或0X前缀)组成的字符串转换成等价的整型,写了一个: /* htoi.c * transform hex to decimal * * compile wit ...
- C语言 16进制字符串转16进制数组 函数示例
函数内容 HexString2Byte. 参数解释 char* in 存放字符串十六进制的buf int len buf长度 unsigned char* out 传出存放十六进制数字的数组 int ...
- linux 16进制 字符串转数字,〖Linux〗Shell十进制数值转换十六进制
Servlet的生命周期+实现方式 1.Servlet的生命周期: (1)被创建: 默认情况下,Servlet第一次被访问时,被服务器创建.会调用init()方法. ...
- C语言:16进制字符串转int
文章目录 前言 代码 前言 今天在C语言中 用到16进制字符串转int整型场景,顺便网上搜了一下 发现有网友用了非常复杂的方法,还去判断字母啥的 用到什么累加的,笔者一想 16进制字符串转int类型 ...
- c语言输出16进制数转字符,(转)C语言16进制输出字符型变量问题
最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: char ...
- java 字节 16进制_Java字节数组和16进制字符串的互相转化
背景基础知识: 1.1. "字符"是由数字来表示的 先来重新了解一下计算机是如何处理"字符"的,这个原理是大家必须记住的,特别是在用JAVA写程序的时候,万万不 ...
- 16进制字符串转化为10进制数
同学在MSN CDC电话面试(可惜我在被面试的时候全然没有这么具体的问题了:))中的一个题目:将16进制的字符串转化为10进制数字,例如"1A",则对应26.题目很简单,实现起来也 ...
- 加解密后字节数组和(16进制)字符串的相互转换问题
前面几篇博客简单归纳了Android中有涉及到的编码和加解密相关的问题,在这里想再补充下加密解密过程中遇到的字节数组和字符串的转换问题.前面博客中包含了转换的代码,由于这个属于所有加解密共性的问题,所 ...
- vc 文字转换到机内码,输入汉字和数字, 输出一串16进制码(数字-〉ASII码,汉字—〉国标码)...
// 可以用,此程序实现的是是文字转换到机内码.机内码=国标码+8080H,不过学习了.//此程序是利用汉字在机器内输出就是机内码的原理,直接保存的,其实挺简单.//输入一串汉字和数字的混合字符, 经 ...
最新文章
- javac编译出现“找不到符号”和软件包不存在的解决
- 【arduino】亲测MAC上arduino安装ESP32 SPIFFS插件
- C语言函数内static关键字 疑惑
- 谓词::不适合Java
- 禁止访问 共享计算机,win7如何禁止局域网用户访问电脑
- 终于记住回车和换行cr lf的来由和含义了 -参考: http://www.cnblogs.com/me115/archive/2011/04/27/2030762.html...
- nginx设置http强制跳转https
- 查询数据库中所有表名称
- OpenCV C++ 常用功能
- [导入]c# GDI+简单绘图(一)
- 秋招很倒霉,但最终还是触底反弹了
- 读取SAE J1939协议数据流
- VS2013编译eXosip2-5.0.0
- 学籍管理系统c语言项目作业,C语言实现学生学籍管理系统
- Python效率之王之多进程和多线程详解
- 颜色格式转换: 最简单的基于FFmpeg的libswscale的示例(YUV转RGB)
- Entertain Box multiset的应用
- 会员营销体系中,企业会员营销需要注意的三个会员问题
- PHP乱码问题,UTF-8(乱码)
- Unity 屏幕特效 之 简单地调整颜色的 色散效果 的实现
热门文章
- win7安装电子专利CPC客户端以及专利文件的生成过程
- 2%用计算机怎么算,五险一金计算器的使用方法
- 计算机网络第七版 第四章课后答案
- AE+BodyMovin导出动画JSON文件
- MMKV_浅析 - MMKV 1.1.1
- 【目标检测算法系列】一、R-CNN算法
- java servlet面试题_servlet面试题一般有哪些?servlet面试大全详解
- java数据结构银行叫号_数据结构C语言版利用队列结构实现银行叫号系统要..._结构工程师_帮考网...
- 钢琴专业打谱软件 Overture 4.02
- 服务器与交换机的lacp协议,IEEE 802.3ad 链路聚合与 LACP 的简单知识 EtherChannel 总结...