函数可以实现从左或从右计算第一个非0位的值,但如果对于有“FF”或全为“00”的字符串则输出0。demo程序如下: #include <stdlib.h> #include <stdio.h> #include <string.h> #include <iostream> #define LEFT 0 #define RIGHT 1 using namespace std; /************************************************************************ *函数功能: 计算十六进制字符串中,从左到右第一个非零位的值 *参数: char *sIn : 输入 : 十六进制字符串,需要空格隔开, * 例如“20 00 00 00 00 00 00” * int &nOut : 输出 : 第一个非零位的值 * 返回值:解析成功返回0,失败返回-1 *************************************************************************/ int HexToBits(char *sIn, int &nOut, int nModel) { unsigned char sHexs[80]; int i,j,len; int subidentifier; if (sIn == NULL) return -1; len = strlen(sIn); /*---对输入的字符串,保存为十六进制数---*/ for(i = 0, j = 0; i < len; i++) { if(isspace(sIn[i])) continue; if (!isxdigit(sIn[i])) return -1; sscanf((char *)&sIn[i], "%x",&subidentifier); if (subidentifier > 255) return -1; sHexs[j++] = (unsigned char)subidentifier; while(isxdigit(sIn[i])) i++; i--; } if (nModel == LEFT) { /*---从左到右查找出第一个非零字节---*/ for(i = 0; i < j; i++) { if (sHexs[i] != 0) break; } if (i == j || sHexs[i] == 255) //全为0或非零字节为“FF” { nOut = 0; return 0; } nOut = i * 8; //先计算非0字节的总位数 j = 0; while ( ((128 >> j) & sHexs[i]) == 0 ) //定位非0字节第一个为零位 j++; nOut = nOut + j + 1; //计算出一个非零位(从左到右) } else { /*---从右到左查找出第一个非零字节---*/ for (i = j-1; i >= 0; i--) { if(sHexs[i] != 0) break; } if (i == -1 || sHexs[i] == 255) //全为0或非零字节为“FF” { nOut = 0; return 0; } nOut = (j-1-i) * 8; j = 0; while( ((1 << j) & sHexs[i]) == 0 ) j++; nOut = nOut + j + 1; } return 0; } /********************************************************************* * 函数功能:HexToBits()函数的反功能,支持8个字节64位 * 参数: int nIn : 输入 : 非零位的值 * char *sOut : 输出 : 转换后的字符串 * 返回值: 成功返回0, 失败返回-1 **********************************************************************/ int BitsToHex(int nIn, char *sOut, int nModel) { char sTemp[8] = {0}; char i,j; if (nIn < 0 || nIn > 63) //最多8个字节,8*8=64 - 1 return -1; j = nIn / 8; //计算第一个非零位所在的字节 i = nIn % 8; //计算非零字节中非零位所在的位数 if(nModel == LEFT) sTemp[j] = 1 << (8-i-1); //得出非零字节的值 else sTemp[8-j-1] = 1 << i; sprintf(sOut, "%02x", (unsigned char)sTemp[0]); for(i = 1; i < 8; i++) sprintf(sOut, "%s %02x", sOut, (unsigned char)sTemp[i]); return 0; } void main(void) { char sStr[128] = "FF FF FF"; char sTemp[128]; int nBits; int nResult; nResult = HexToBits(sStr, nBits, RIGHT); if (nResult < 0) { cout << "HexToBits failed" << endl; } else cout << "HexToBits success, nBits=" << nBits << endl; memset(sTemp, 0, sizeof(sTemp)); nResult = BitsToHex(nBits - 1, sTemp, RIGHT); if (nResult < 0) { cout << "BitsToHex failed." << endl; } else cout << "BitsToHex success.sTemp = " << sTemp << endl; }