每每遇到這些問題就要想個半天,想不明白還不舒服,今天特別把所想整理下避免以后再次進入思想漩渦!!!
計算機存儲和傳輸都是以字節為單位
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; }