1. 程式人生 > >字串Ascll格式轉16進位制

字串Ascll格式轉16進位制

之前做過一些專案需要用到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格式方法!