字串Ascll格式轉16進位制
阿新 • • 發佈:2019-02-04
之前做過一些專案需要用到ASCLL碼轉換到16進位制,在網上搜索後發現,大部分都是10進位制數字轉16進位制資料,這對於8位字元型別unsignal char
(這裡不用char,因為char是-127到128,對於129-255之間的數溢位變為負數,算起來稍微麻煩 ,採用unsignal char是因為它的值在0到255)
來講他可以接收最大為255的數字(從Ascll碼左邊可以看到數字),市面上的轉換方式大多都是一個char對應一個數字比如0-F,這對於char說浪費4位沒有使用而且超過’f’範圍的解析不了;
下面貼上手動實現的程式碼:
函式定義如下:
int charToHex(char * dst,const unsigned char* src,int len);
程式碼實現如下:
//第一個引數表示輸出轉換字串 空間大小大大於 src的2倍
//第2個引數表示輸入字串(ASCLL碼)
//第3個引數表示需要轉換字串長度
int charToHex(char* dst,const unsigned char* src,int len)
{
if (0 == src)
{
return -1;
}
int nNum = 0;
const unsigned char*psrc = src;
for (int i = 0;i < len;i++)
{
int nval = *(psrc + i);
if (15 >= nval && 0 <= nval)
{
if (9 >= nval && 0 <= nval)
{
*(dst + i * 2) = '0';
*(dst + i * 2 + 1) = '0' + nval;
nNum += 2;
continue;
}
switch (nval)//下面的演算法中,把一個ascll字元轉換為2個16進位制數字,如果ascll小於F那麼高位補0
{
case 10:
*(dst + i * 2) = '0';
*(dst + i * 2 + 1) = 'A';
break;
case 11:
*(dst + i * 2) = '0';
*(dst + i * 2 + 1) = 'B';
break;
case 12:
*(dst + i * 2) = '0';
*(dst + i * 2 + 1) = 'C';
break;
case 13:
*(dst + i * 2) = '0';
*(dst + i * 2 + 1) = 'D';
break;
case 14:
*(dst + i * 2) = '0';
*(dst + i * 2 + 1) = 'E';
break;
case 15:
*(dst + i * 2) = '0';
*(dst + i * 2 + 1) = 'F';
break;
}
nNum += 2;
}
else if (255 >= nval &&15 < nval)
{
int nRun = nval / 16;
int nRem = nval%16;
switch (nRun)
{
case 10:
*(dst + i * 2) = 'A';
break;
case 11:
*(dst + i * 2) = 'B';
break;
case 12:
*(dst + i * 2) = 'C';
break;
case 13:
*(dst + i * 2) = 'D';
break;
case 14:
*(dst + i * 2) = 'E';
break;
case 15:
*(dst + i * 2) = 'F';
break;
}
if (9 >= nRun)
{
*(dst + i * 2) = '0' + nRun;
nNum ++;
}
else
{
nNum ++;
}
if (9 >= nRem)
{
*(dst + i * 2 + 1) = '0' + nRem;
nNum ++;
continue;
}
switch (nRem)//個位
{
case 10:
*(dst + i * 2 + 1) = 'A';
break;
case 11:
*(dst + i * 2 + 1) = 'B';
break;
case 12:
*(dst + i * 2 + 1) = 'C';
break;
case 13:
*(dst + i * 2 + 1) = 'D';
break;
case 14:
*(dst + i * 2 + 1) = 'E';
break;
case 15:
*(dst + i * 2 + 1) = 'F';
break;
}
nNum ++;
}
else
{
*(dst + i * 2) = '0';
*(dst + i * 2 + 1) = '0';
nNum += 2;
}
}
return nNum;
}
實現原理:
1.根據8位ascll碼(unsignal char)最大255,轉換成16進製為FF。
2.每4位表示一個16進位制數字,如果ascll碼小於等於F也就是隻有低4位,那麼16進位制高位補零。
下一章講解16進位制轉換Ascll格式方法!