[cpp] view plain copy

    1. /*BCD 与 ASCII码转换*/  
    2.   
    3. /******************************************************************* 
    4. 函数名:  asc2bcd  
    5. 功能描述:将ascii码转换为bcd码 
    6. 参数:     
    7.          bcd:转换后的BCD码 
    8.          asc:需转换的ASCII码串 
    9.          len:需转换的ascii码串长度 
    10.  
    11. 返回值:  uint32  
    12.                               0:成功 
    13.                               其他:失败 
    14. ********************************************************************/  
    15. uint32 asc2bcd(uint8* bcd, const uint8* asc, uint32 len);  
    16.   
    17. /******************************************************************* 
    18. 函数名: bcd2asc  
    19. 功能描述:将bcd码转换为ascii码串 
    20. 参数:     
    21.          asc:转换的ASCII码串 
    22.          bcd:需转换的BCD码 
    23.          len:需转换的BCD码长度 
    24.  
    25. 返回值:  uint32  
    26.                               0:成功 
    27.                               其他:失败 
    28. ********************************************************************/  
    29. uint32 bcd2asc(uint8* asc, const uint8* bcd, uint32 len);  
        
    [cpp] view plain copy
    
     
    1. #include <assert.h>  
    2.   
    3. #include "utils.h"  
    4. //基于查表实现BCD与Ascii之间的转换  
    5. static uint8 bcd2ascii[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};  
    6.   
    7. static uint8 ascii2bcd1[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};  
    8. static uint8 ascii2bcd2[6]  = {0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};  
     
    [cpp] view plain copy
    
     
    1. uint32   
    2. ASC2BCD(uint8 *bcd, const uint8 *asc, uint32 len)  
    3. {  
    4.     uint8 c = 0;  
    5.     uint8 index = 0;  
    6.     uint8 i = 0;    
    7.       
    8.     len >>= 1;      
    9.   
    10. for(; i < len; i++) {  
    11. //first BCD  
    12. if(*asc >= 'A' && *asc <= 'F') {  
    13. 'A';   
    14.             c  = ascii2bcd2[index] << 4;  
    15. else if(*asc >= '0' && *asc <= '9') {  
    16. '0';  
    17.             c  = ascii2bcd1[index] << 4;  
    18.         }  
    19.         asc++;  
    20.   
    21. //second BCD  
    22. if(*asc >= 'A' && *asc <= 'F') {  
    23. 'A';   
    24.             c  |= ascii2bcd2[index];  
    25. else if(*asc >= '0' && *asc <= '9') {  
    26. '0';  
    27.             c  |= ascii2bcd1[index];  
    28.         }  
    29.         asc++;  
    30.   
    31.         *bcd++ = c;  
    32.     }     
    33.   
    34. return 0;  
    35. }  
     
     
    [cpp] view plain copy
    
     
    1. uint32  
    2. BCD2ASC (uint8 *asc, const uint8 *bcd, uint32 len)  
    3. {  
    4.     uint8 c = 0;  
    5.     uint8 i;  
    6.   
    7.   
    8. for(i = 0; i < len; i++) {  
    9. //first BCD  
    10.         c = *bcd >> 4;  
    11.         *asc++ = bcd2ascii[c];  
    12.   
    13.   
    14. //second  
    15.         c = *bcd & 0x0f;  
    16.         *asc++ = bcd2ascii[c];  
    17.         bcd++;  
    18.     }  
    19.   
    20.   
    21. return 0;  
    22. }  
     
     
     
    [cpp] view plain copy
    
     
    1. int main(void)//测试程序  
    2. {  
    3. const unsigned char ascii[12] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C'};  
    4. char bcd[6];  
    5.   
    6.     ASC2BCD(bcd, ascii, 12, 0);   
    7.       
    8. int i = 0;  
    9.   
    10. "ascii = %s\n", ascii);  
    11.   
    12. for(; i < 6; i++) {  
    13. "bcd = 0x%.2x\n", bcd[i]);  
    14.     }     
    15.   
    16. /*   
    17.        unsigned char ascii[13] = {0}; 
    18.        const unsigned char bcd[6] = {0x01, 0x23, 0x45, 0xCD, 0xEF, 0xAB}; 
    19.  
    20.        BCD2ASC(ascii, bcd, 6, 0); 
    21.        printf("ascii = %s\n", ascii); 
    22.        */  
    23. return 0;  
    24. }