ASCII(American Standard Code for Information Interchange,美國信息交換標(biāo)準(zhǔn)代碼)是基于拉丁字母的一套電腦編碼系統(tǒng),主要用于顯示現(xiàn)代英語和其他西歐語言。它是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng),并等同于國際標(biāo)準(zhǔn)ISO/IEC 646。
請注意,ASCII是American Standard Code for Information Interchange縮寫,而不是ASCⅡ(羅馬數(shù)字2),有很多人在這個地方產(chǎn)生誤解。
在計算機中,所有的數(shù)據(jù)在存儲和運算時都要使用二進制數(shù)表示(因為計算機用高電平和低電平分別表示1和0),例如,像a、b、c、d這樣的52個字母(包括大寫)、以及0、1等數(shù)字還有一些常用的符號(例如*、#、@等)在計算機中存儲時也要使用二進制數(shù)來表示,而具體用哪些二進制數(shù)字表示哪個符號,當(dāng)然每個人都可以約定自己的一套(這就叫編碼),而大家如果要想互相通信而不造成混亂,那么大家就必須使用相同的編碼規(guī)則,于是美國有關(guān)的標(biāo)準(zhǔn)化組織就出臺了ASCII編碼,統(tǒng)一規(guī)定了上述常用符號用哪些二進制數(shù)來表示。
美國標(biāo)準(zhǔn)信息交換代碼是由美國國家標(biāo)準(zhǔn)學(xué)會(American National Standard Institute , ANSI )制定的,標(biāo)準(zhǔn)的單字節(jié)字符編碼方案,用于基于文本的數(shù)據(jù)。起始于50年代后期,在1967年定案。它最初是美國國家標(biāo)準(zhǔn),供不同計算機在相互通信時用作共同遵守的西文字符編碼標(biāo)準(zhǔn),它已被國際標(biāo)準(zhǔn)化組織(International Organization for Standardization, ISO)定為國際標(biāo)準(zhǔn),稱為ISO 646標(biāo)準(zhǔn)。適用于所有拉丁文字字母。
BCD碼(Binary-Coded Decimal?)亦稱二進碼十進數(shù)或二-十進制代碼。用4位二進制數(shù)來表示1位十進制數(shù)中的0~9這10個數(shù)碼。是一種二進制的數(shù)字編碼形式,用二進制編碼的十進制代碼。BCD碼這種編碼形式利用了四個位元來儲存一個十進制的數(shù)碼,使二進制和十進制之間的轉(zhuǎn)換得以快捷的進行。這種編碼技巧最常用于會計系統(tǒng)的設(shè)計里,因為會計制度經(jīng)常需要對很長的數(shù)字串作準(zhǔn)確的計算。相對于一般的浮點式記數(shù)法,采用BCD碼,既可保存數(shù)值的精確度,又可免去使電腦作浮點運算時所耗費的時間。此外,對于其他需要高精確度的計算,BCD編碼亦很常用。
由于十進制數(shù)共有0、1、2、……、9十個數(shù)碼,因此,至少需要4位二進制碼來表示1位十進制數(shù)。4位二進制碼共有2^4=16種碼組,在這16種代碼中,可以任選10種來表示10個十進制數(shù)碼,共有N=16!/[10!*(16-10)?。莸扔?008種方案。常用的BCD代碼列于末。
BCD與ASCII碼互轉(zhuǎn)
最近由于項目需要,需要將BCD編碼轉(zhuǎn)換為對應(yīng)的字符串,下面為C語言實現(xiàn),經(jīng)測試好用!
[cpp] view plain copy/*BCD 與 ASCII碼轉(zhuǎn)換*/
/*******************************************************************
函數(shù)名: asc2bcd
功能描述:將ascii碼轉(zhuǎn)換為bcd碼
bcd:轉(zhuǎn)換后的BCD碼
asc:需轉(zhuǎn)換的ASCII碼串
len:需轉(zhuǎn)換的ascii碼串長度
返回值: uint32
0:成功
其他:失敗
********************************************************************/
uint32 asc2bcd(uint8* bcd, const uint8* asc, uint32 len);
/*******************************************************************
函數(shù)名: bcd2asc
功能描述:將bcd碼轉(zhuǎn)換為ascii碼串
參數(shù):
asc:轉(zhuǎn)換的ASCII碼串
bcd:需轉(zhuǎn)換的BCD碼
len:需轉(zhuǎn)換的BCD碼長度
返回值: uint32
0:成功
其他:失敗
********************************************************************/
uint32 bcd2asc(uint8* asc, const uint8* bcd, uint32 len);
[cpp] view plain copy#include 《assert.h》
#include “utils.h”
//基于查表實現(xiàn)BCD與Ascii之間的轉(zhuǎn)換
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};
?。踓pp] view plain copyuint32
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;
}
[cpp] view plain copyuint32
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;
}
?。踓pp] view plain copyint 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;
}
評論
查看更多