[资源共享]

单片机字符串转各种位宽的函数

[复制链接]
1226|8
手机看帖
扫描二维码
随时随地手机跟帖
一刀一级|  楼主 | 2022-5-23 15:00 | 显示全部楼层 |阅读模式
十进制数值字符串转各种位宽的整形数据demo
本demo实现了字符串转各种位宽的函数,代码简单效率高,非常适合单片机嵌入式应用。需要注意的是字符串需要按照严格的输入要求输入才行,比如“-127”,“255”等,除了第一个字符可以是负号‘-’外,其他字符必须是数字,对应位宽的数字字符,必须选择对应的函数。demo如下,可以直接拷贝到C语言编译器,编译允许即可获得结果。
  • #include <stdio.h>
  • #include <string.h>
  •     /* exact-width signed integer types */
  • typedef   signed          char int8_t;
  • typedef   signed short     int int16_t;
  • typedef   signed           int int32_t;
  • typedef   signed       long long int64_t;
  •     /* exact-width unsigned integer types */
  • typedef unsigned          char uint8_t;
  • typedef unsigned short     int uint16_t;
  • typedef unsigned           int uint32_t;
  • typedef unsigned       long long uint64_t;
  • int8_t cAto8(const char * pcString,uint8_t ucLength){
  •         int8_t cInt8 = 0;
  •         uint8_t ucI = 0;
  •         if(pcString[ucI] == '-'){//
  •                 ucI++;
  •         }
  •         for(;ucI<ucLength;ucI++){
  •                 cInt8 = cInt8*10 + pcString[ucI]-'0';
  •         }
  •         if(pcString[0] == '-'){//
  •                 cInt8 = ~cInt8 + 1;
  •         }
  •         return cInt8;
  • }
  • uint8_t ucAtou8(const char * pcString,uint8_t ucLength){
  •         uint8_t ucInt8 = 0;
  •         uint8_t ucI = 0;
  •         for(;ucI<ucLength;ucI++){
  •                 ucInt8 = ucInt8*10 + pcString[ucI]-'0';
  •         }
  •         return ucInt8;
  • }
  • int16_t sAto16(const char * pcString,uint8_t ucLength){
  •         int16_t sInt16 = 0;
  •         uint8_t ucI = 0;
  •         if(pcString[ucI] == '-'){//
  •                 ucI++;
  •         }
  •         for(;ucI<ucLength;ucI++){
  •                 sInt16 = sInt16*10 + pcString[ucI]-'0';
  •         }
  •         if(pcString[0] == '-'){//
  •                 sInt16 = ~sInt16 + 1;
  •         }
  •         return sInt16;
  • }
  • uint16_t usAtou16(const char * pcString,uint8_t ucLength){
  •         uint16_t usInt16 = 0;
  •         uint8_t ucI = 0;
  •         for(;ucI<ucLength;ucI++){
  •                 usInt16 = usInt16*10 + pcString[ucI]-'0';
  •         }
  •         return usInt16;
  • }
  • int32_t iAto32(const char * pcString,uint8_t ucLength){
  •         int32_t iInt32 = 0;
  •         uint8_t ucI = 0;
  •         if(pcString[ucI] == '-'){//
  •                 ucI++;
  •         }
  •         for(;ucI<ucLength;ucI++){
  •                 iInt32 = iInt32*10 + pcString[ucI]-'0';
  •         }
  •         if(pcString[0] == '-'){//
  •                 iInt32 = ~iInt32 + 1;
  •         }
  •         return iInt32;
  • }
  • uint32_t uiAtou32(const char * pcString,uint8_t ucLength){
  •         uint32_t uiInt32 = 0;
  •         uint8_t ucI = 0;
  •         for(;ucI<ucLength;ucI++){
  •                 uiInt32 = uiInt32*10 + pcString[ucI]-'0';
  •         }
  •         return uiInt32;
  • }
  • int64_t lAto64(const char * pcString,uint8_t ucLength){
  •         int64_t lInt64 = 0;
  •         uint8_t ucI = 0;
  •         if(pcString[ucI] == '-'){//
  •                 ucI++;
  •         }
  •         for(;ucI<ucLength;ucI++){
  •                 lInt64 = lInt64*10 + pcString[ucI]-'0';
  •         }
  •         if(pcString[0] == '-'){//
  •                 lInt64 = ~lInt64 + 1;
  •         }
  •         return lInt64;
  • }
  • uint64_t ulAtou64(const char * pcString,uint8_t ucLength){
  •         uint64_t ulInt64 = 0;
  •         uint8_t ucI = 0;
  •         for(;ucI<ucLength;ucI++){
  •                 ulInt64 = ulInt64*10 + pcString[ucI]-'0';
  •         }
  •         return ulInt64;
  • }
  • main(int argc, char *argv[])
  • {
  •         int8_t a1;
  •         uint8_t a2;
  •         int16_t b1;
  •         uint16_t b2;
  •         int32_t c1;
  •         uint32_t c2;
  •         int64_t d1;
  •         uint64_t d2;
  •         a1 = cAto8("-128",strlen("-128"));
  •         printf("a1=%d\r\n",a1);
  •         a2 = ucAtou8("255",strlen("255"));
  •         printf("a2=%d\r\n",a2);
  •         b1 = sAto16("-32768",strlen("-32768"));
  •         printf("b1=%d\r\n",b1);
  •         b2 = usAtou16("65535",strlen("65535"));
  •         printf("b2=%d\r\n",b2);
  •         c1 = iAto32("-2147483648",strlen("-2147483648"));
  •         printf("c1=%ld\r\n",c1);
  •         c2 = uiAtou32("4294967295",strlen("4294967295"));
  •         printf("c2=%u\r\n",c2);
  •         d1 = lAto64("-9223372036854775808",strlen("-9223372036854775808"));
  •         printf("d1=%ld\r\n",d1);
  •         d2 = ulAtou64("18446744073709551615",strlen("18446744073709551615"));
  •         printf("d2=%lu\r\n",d2);
  •         return 0;
  • }
  • /*-------------------(C) COPYRIGHT 2020 头条@单片嵌入式爱好者 ----------------*/
  • 运行结果如下:
  • a1=-128
  • a2=255
  • b1=-32768
  • b2=65535
  • c1=2147483648
  • c2=4294967295
  • d1=-9223372036854775808
  • d2=18446744073709551615

使用特权

评论回复
koala889| | 2022-5-26 21:31 | 显示全部楼层
什么程序,这是

使用特权

评论回复
tpgf| | 2022-6-4 11:06 | 显示全部楼层
那对数据类型有要求啊

使用特权

评论回复
drer| | 2022-6-4 11:59 | 显示全部楼层
demo风格非常不错哈

使用特权

评论回复
qcliu| | 2022-6-4 12:40 | 显示全部楼层
这个函数功能非常通用啊

使用特权

评论回复
coshi| | 2022-6-4 12:56 | 显示全部楼层
数据种类非常丰富了

使用特权

评论回复
kxsi| | 2022-6-4 13:52 | 显示全部楼层
最大支持多宽的啊

使用特权

评论回复
wiba| | 2022-6-4 14:33 | 显示全部楼层
非常不错 省的我自己写了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

57

主题

344

帖子

0

粉丝