BCD与ASCII码互转-C语言实现

最近由于项目需要,需要将BCD编码转换为对应的字符串,下面为C语言实现,经测试好用!

转载请标明出处!

/*BCD 与 ASCII码转换*/

/*******************************************************************
函数名:  asc2bcd
功能描述:将ascii码转换为bcd码
参数:
         bcd:转换后的BCD码
         asc:需转换的ASCII码串
         len:需转换的ascii码串长度

返回值:  uint32
                              0:成功
                              其他:失败
********************************************************************/
uint32 asc2bcd(uint8* bcd, const uint8* asc, uint32 len);

/*******************************************************************
函数名: bcd2asc
功能描述:将bcd码转换为ascii码串
参数:
         asc:转换的ASCII码串
         bcd:需转换的BCD码
         len:需转换的BCD码长度

返回值:  uint32
                              0:成功
                              其他:失败
********************************************************************/
uint32 bcd2asc(uint8* asc, const uint8* bcd, uint32 len);

#include <assert.h>

#include "utils.h"
//基于查表实现BCD与Ascii之间的转换
static uint8 bcd2ascii[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

static uint8 ascii2bcd1[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
static uint8 ascii2bcd2[6]  = {0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
uint32
ASC2BCD(uint8 *bcd, const uint8 *asc, uint32 len)
{
    uint8 c = 0;
    uint8 index = 0;
    uint8 i = 0;  

    len >>= 1;    

    for(; i < len; i++) {
        //first BCD
        if(*asc >= 'A' && *asc <= 'F') {
            index = *asc - 'A';
            c  = ascii2bcd2[index] << 4;
        } else if(*asc >= '0' && *asc <= '9') {
            index = *asc - '0';
            c  = ascii2bcd1[index] << 4;
        }
        asc++;

        //second BCD
        if(*asc >= 'A' && *asc <= 'F') {
            index = *asc - 'A';
            c  |= ascii2bcd2[index];
        } else if(*asc >= '0' && *asc <= '9') {
            index = *asc - '0';
            c  |= ascii2bcd1[index];
        }
        asc++;

        *bcd++ = c;
    }   

    return 0;
}

uint32
BCD2ASC (uint8 *asc, const uint8 *bcd, uint32 len)
{
    uint8 c = 0;
    uint8 i;

    for(i = 0; i < len; i++) {
        //first BCD
        c = *bcd >> 4;
        *asc++ = bcd2ascii[c];

        //second
        c = *bcd & 0x0f;
        *asc++ = bcd2ascii[c];
        bcd++;
    }

    return 0;
}
int main(void)//测试程序
{
    const unsigned char ascii[12] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C'};
    unsigned char bcd[6];

    ASC2BCD(bcd, ascii, 12, 0); 

    int i = 0;

    printf("ascii = %s\n", ascii);

    for(; i < 6; i++) {
        printf("bcd = 0x%.2x\n", bcd[i]);
    }   

    /*
       unsigned char ascii[13] = {0};
       const unsigned char bcd[6] = {0x01, 0x23, 0x45, 0xCD, 0xEF, 0xAB};

       BCD2ASC(ascii, bcd, 6, 0);
       printf("ascii = %s\n", ascii);
       */
    return 0;
}
时间: 2024-12-12 17:48:23

BCD与ASCII码互转-C语言实现的相关文章

[PHP]chr和ord函数实现字符串和ASCII码互转

chr和ord函数是用来字符串和ASCII码互转的.  ASCII码是计算机所能显示字符的编码,它的取值范围是0-255,其中包括标点.字母.数字.汉字等.在编程过程中,经常把指定的字符转化为ASCII码进行比较. 下面是PHP提供的转换ASCII码和字符的函数. 1.chr()函数 该函数用于将ASCII码值转化为字符串.其函数声明如下: string chr (int ascii); 2.ord()函数 该函数用于将字符串转化为ASCII码值.其函数声明如下: int ord(string 

Java字符串跟ASCII码互转

1.由于项目中遇到,在服务器端起的jar包程序,给前台发消息后,前段收到的消息出现乱码情况,所以采取在后才发消息前先把消息字符串转成ASCII码再发往前台,前台采取在收到后台消息先把ASCII码转成字符串的解决方案进行解决. 1)将字符串转成ASCII的Java方法 public static String stringToAscii(String value) { StringBuffer sbu = new StringBuffer(); char[] chars = value.toCha

java 字符与ASCII码互转

字符转对应ASCII码 // 方法一:将char强制转换为byte char ch = 'A'; byte byteAscii = (byte) ch; System.out.println(byteAscii); // 方法二:将char直接转化为int,其值就是字符的ascii int byteAscii1 = (int) ch; System.out.println(byteAscii1); ASCII码转字符 // 直接int强制转换为char int ascii = 65; char

[整理]C语言中字符常量与ASCII码

所有的ASCII码都可以用"\"加数字(一般是8进制数字)来表示.而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了. C语言中提供的所有的转码序列(转义字符序列): 转义字符 意义 ASCII码值(十进制) \a 响铃(BEL) 007 \b 退格(BS) ,将当前位置移到前一列 008 \f 换页(FF),将当前位置移到下页开头 012 \n 换行(LF

BCD码转换成二进制和ASCII码

首先得知道什么是BCD码,可以看下百度,基本定义已经讲清楚了,百度链接:BCD码--百度百科:这里要说的也是最常用的一种BCD码:8421码.本文规定若没有特殊说明时,各个数值只会是十进制数.二进制数.ASCII值其中的一种进制数. BCD码是用4位二进制数(各个位的权重分别为:8421,所以叫8421码)来表示一位十进制数.这里的一位十进制数要特别说明下,一位十进制数只能是 0-9之间的一个数值.比如:6 就是表示一位十进制数6:66则是表示两位十进制数:666则是表示三位十进制数:(好像有点

如何用C语言显示ascii码超过127的字符

C语言的程序代码如下: #include "stdio.h"main(){      int i;      for (i=1;i<256;i++)          {              printf("%c ",i);          }          getchar();} 显示结果: 编码在127以上的都显示为"?". 这是因为 编号在128-255的是扩展的编码,原本就不是作为显示用的,当然在不同的终端上显示就不一致

2016.06.06 周一 C语言 将字符串根据字符的ASCII码从大到小排序并打印出字符串中的字符类型的总数

第一次变量冲突问题 解决了一个多小时,.... 代码如下: ↓ #include<stdio.h> #include<string.h> #define N 200 //输入字符串的最大长度 int main() { //************************输入开始部分******************************** printf("请输入字符串.(长度在200以内)\n\n"); int i=0,j,k,temp,lowLetter

C语言字符转换ASCII码

//函 数 名:CharToHex()//功能描述:把ASCII字符转换为16进制//函数说明://调用函数://全局变量://输    入:ASCII字符//返    回:16进制/////////////////////////////////////////////////////////////////////unsigned char CharToHex(unsigned char bHex){    if((bHex>=0)&&(bHex<=9))        b

C语言之字符集、ASCII码和sizeof运算符

一 字符集和ASCII码 结论:字符本质上也是一个整数,每个字符都有唯一一个与之对应的整数, 比如说小写的a对应97,b对应98,c对应99,大写的A对应65,B对应66,C对应67 所以字符对应的那个数字,也可以称之为ASCII码值 二 sizeof运算符 sizeof: 用法:sizeof(类型);  sizeof(变量); sizeof(常量); 可以计算这个类型或者变量或者常量占用的字节数 tips: sizeof结果是unsigned long类型(unsigned long; 无符号