找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4101|回复: 0

一个字符串转换成字节数组的函数

[复制链接]
发表于 2013-1-10 18:10:49 | 显示全部楼层 |阅读模式
最近因为工作需要,需要一些字符串装换成字符数组的方法。
网上查了一下,没有现成的,只好自己写一个。必须能做到过滤字符串中的错误字符,以及非法字符。
必须能实现如下过滤,并且有字符串溢出判断,比如:
"ef 010 AD 02 BD"
转换后是
char[4] EF AD 02 BD

"ef 010 AD 02 SD"
转换后是
char[3] EF AD 02

代码如下:在这记录一下。
  1. bool GetChar(unsigned char cTag, unsigned char& cDes)
  2. {
  3.   if(cTag >='A'&&  cTag <='F')
  4.   {
  5.     cDes = cTag - 'A' + 10;
  6.     return true;
  7.   }
  8.   else if(cTag >='a'&&  cTag <='f')
  9.   {
  10.     cDes = cTag - 'a' + 10;
  11.     return true;
  12.   }
  13.   else if(cTag >= '0'&& cTag<= '9')
  14.   {
  15.     cDes = cTag-'0';
  16.     return true;
  17.   }
  18.   else
  19.   {
  20.     return false;
  21.   }
  22. }
  23. bool ConvertStr2char(const char* pData, unsigned char& cData)
  24. {
  25.   if(pData == NULL || strlen(pData) != 2)
  26.   {
  27.     return false;
  28.   }
  29.   char cFirst = pData[1];
  30.   unsigned char cTemp = 0;
  31.   bool blStste = GetChar(cFirst, cTemp);
  32.   if(false == blStste)
  33.   {
  34.     return false;
  35.   }
  36.   cData = cTemp;
  37.   char cSecond = pData[0];
  38.   blStste  = GetChar(cSecond, cTemp);
  39.   if(false == blStste)
  40.   {
  41.     return false;
  42.   }
  43.   cTemp = cTemp << 4;
  44.   cData = cData | cTemp;
  45.   return true;
  46. }
  47. bool Convertstr2charArray(const char* pData, int nSrcLen, unsigned char* pDes, int& nMaxLen)
  48. {
  49.   char szData[3] = {'\0'};
  50.   int nPos         = 0;
  51.   int nCurrSize    = 0;
  52.   int nConvertSize = 0;
  53.   bool blState     = false;   //转换后的字符串是否有效
  54.   bool blSrcState  = true;    //元字符串是否有效
  55.   while(nPos < nSrcLen)
  56.   {
  57.     if(pData[nPos] == '\r' || pData[nPos] == '\n' || pData[nPos] == ' ' || nPos == nSrcLen - 1)
  58.     {
  59.       if(nPos == nSrcLen - 1)
  60.       {
  61.         szData[nCurrSize++] = pData[nPos];
  62.       }
  63.       szData[nCurrSize] = '\0';
  64.       if(nConvertSize < nMaxLen && blSrcState == true)
  65.       {
  66.         blState = ConvertStr2char(szData, pDes[nConvertSize]);
  67.         if(blState == true)
  68.         {
  69.           nConvertSize++;
  70.         }
  71.       }
  72.       nCurrSize  = 0;
  73.       blSrcState = true;
  74.       nPos++;
  75.     }
  76.     else
  77.     {
  78.       if(nCurrSize < 2)
  79.       {
  80.          szData[nCurrSize++] = pData[nPos];
  81.       }
  82.       else
  83.       {
  84.         blSrcState = false;
  85.       }
  86.       nPos++;
  87.     }
  88.   }
  89.   nMaxLen = nConvertSize;
  90.   return true;
  91. }
复制代码
测试代码如下:
  1. int main(int argc, char* argv[])
  2. {
  3.   char c[20];
  4.   unsigned char s[10];
  5.   int nCurrLen = 10;
  6.   sprintf(c, "ef 010 AD 02 BD");
  7.   Convertstr2charArray(c, strlen(c), (unsigned char*)s, nCurrLen);
  8.   printf("=============================\n");
  9.   for(int i = 0; i < nCurrLen; i++)
  10.   {
  11.     printf("0x%02X ", s[i]);
  12.   }
  13.   printf("\n");
  14.   printf("=============================\n");
  15.   return 0;
  16. }
复制代码
在Linux下测试通过,符合要求。在这里记录一下。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-4-29 22:54 , Processed in 0.012230 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表