ASCII碼、HEX、字符、BCD 等等 基礎知識思考


每每遇到這些問題就要想個半天,想不明白還不舒服,今天特別把所想整理下避免以后再次進入思想漩渦!!!

計算機存儲和傳輸都是以字節為單位
        1 bit     = 1  二進制數據
        1 byte  = 8  bit
        1 字母 = 1  byte = 8 bit
        1 漢字 = 2  byte = 16 bit
1. bit:位
    一個二進制數據0或1,是1bit;
2. byte:字節
    存儲空間的基本計量單位,如:MySQL中定義 VARCHAR(45)  即是指 45個字節;
    1 byte = 8 bit
3. 一個英文字符占一個字節;
    1 字母 = 1 byte = 8 bit
4. 一個漢字占2個字節;
    1 漢字 = 2 byte = 16 bit
5. 標點符號
    A>.  漢字輸入狀態下,默認為全角輸入方式;
    B>.  英文輸入狀態下,默認為半角輸入方式;
    C>.  全角輸入方式下,標點符號占2字節;
    D>.  半角輸入方式下,標點符號占1字節;


    故:漢字輸入狀態下的字符,占2個字節 (但不排除,自己更改了默認設置);
         英文輸入狀態下的字符,占1個字節 (但不排除,自己更改了默認設置);

ASCII碼
  因為信息在計算機上是用二進制表示的,這種表示法讓人理解就很困難。因此計算機上都配有輸入和輸出設備,這些設備的主要目的就是,
以一種人類可閱讀的形式 將信息在這些設備上顯示出來供人閱讀理解。為保證人類和設備,設備和計算機之間能進行正確的信息交換,人們編
制的統一的信息交換代碼,這就是ASCII碼表,它的全稱是“美國信息交換標准代碼”。

BCD碼
  BCD碼(Binary-Coded Decimal?)亦稱二進碼十進數或二-十進制代碼。用4位二進制數來表示1位十進制數中的0~9這10個數碼。是一種二
進制的數字編碼形式,用二進制編碼的十進制代碼。BCD碼這種編碼形式利用了四個位元來儲存一個十進制的數碼,使二進制和十進制之間的轉
換得以快捷的進行。

asc2hex
        就是字符串轉化成16進制數字 如:“4321”  0x34 0x33 0x32 0x31 --> 0x43 0x21
        
hex2asc
        就是16進制數字轉化成字符串 如: 0x43 0x21 --> “4321”  0x34 0x33 0x32 0x31
        
以下給出兩種實現方法:

unsigned char ascii_table[16] = {
   '0', '1', '2', '3', '4', '5', '6', '7',
   '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
};
   '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
};

void hex2asc(unsigned char dat, unsigned char **new)
{
   **new = ascii_table[dat >> 4];
   *new += 1;
   **new = ascii_table[dat & 0x0f];
   *new += 1;
}

int asc2hex(unsigned char dat, unsigned char *new)
{
   if ((dat >= '0') && (dat <= '9'))
      *new = dat - '0';
   else if ((dat >= 'A') && (dat <= 'F'))
      *new = dat - 'A' + 10;
   else if ((dat >= 'a') && (dat <= 'f'))
      *new = dat - 'a' + 10;
   else
      return -1;
   return 0;
}

void hex2str(unsigned char *read, unsigned char **write, int len)
{
   while (len--)
      hex2asc(*read++, write);
}

int str2hex(unsigned char *read, unsigned char *write, int len)
{
   unsigned char dat;

   while (len--) {
      if (asc2hex(*read++, &dat))
         return -1;
      *write = *write << 4 | dat;
      if (!(len & 1)) {
         ++write;
      }
   }
   return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM