视角:C语言将十六进制字符串转成十进制整数
在前文《再议C语言将十六进制字符串转成十进制整数》中 @大致 童鞋帮忙提了一个思路:直接将指针p
读取的十六进制字符串中的单个字符转换后的结果保存在iResult
中,而不是保存在指针p指向的内存中。这样思路更为简洁,下面是具体的两个实现程序。
在前文《再议C语言将十六进制字符串转成十进制整数》中 @大致 童鞋帮忙提了一个思路:直接将指针p
读取的十六进制字符串中的单个字符转换后的结果保存在iResult
中,而不是保存在指针p指向的内存中。这样思路更为简洁,下面是具体的两个实现程序。
前文《C语言将十六进制字符串转成十进制整数》讲述了将十六进制字符串中单个字符分别从高位到低位正序和从低位到高位逆序转换成对应的十进制数,今天在看原文的程序发现一个不好的地方:由于使用了char * p = HexStr;
,也就是直接使用指针p将这个十六进制字符串进行了读取和改写
。这样会造成在调用了HexStr2Integer
转换函数后,就不能再次使用这个十六进制字符串了。
因此,在转换过程中,可以考虑将原来的这个十六进制字符串在内存中复制一份,然后再对这个复制的副本
进行读写,这样就产生副作用了。下面是根据原来的两个程序改进的的代码,主要通过malloc
函数开辟一个内存空间,然后复制十六进制字符串中的数据到这个内存空间中,最后对它进行“读写”。
在下面这两个改进的代码中,还考虑到了这个十六进制字符串以0x
开头的形式出现,所以增加了这种情况的处理。
通过上一篇文章完成了十六进制字符串转成十进制整数,同理也很容易写出十进制字符串转成十进制整数的函数。考虑到十进制的字符串中可能会出现正负号,即转换后可能出现负整数,同样也增加了对这种情况的处理。例如将十进制的字符串"0621"、"+621"、"6210"、"-1234"转换十进制的整数,即621、621、6210、-1234。下面同样是正向和逆向两种方法的具体代码:
C/C++处理十六进制文件中的报文内容时,经常会遇到先读取报文头中的长度(例如"E2"、"1F"、"-eE2"等等),再读取报文体中的内容的情况。那么就需要把报文头中表示长度的十六进制字符串转换成十进制的整形数据。
转换方法有两种,一种是正向从字符串低位到高位依次转换,另一种是逆向从字符串高位到低位依次转换。原理都是利用指针变量依次指向十六进制字符串中的单个字符,然后通过ASCII码表转换成对应的整数。考虑到十进制的字符串中可能会出现正负号,即转换后可能出现负整数,所以增加了对这种情况的处理。下面是两种方法的具体代码: