• 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;
    }

    转自:http://www.cnblogs.com/uriel/p/4533840.html

  • 相关阅读:
    BBS登入和数据库迁移部分
    Auth组件
    【作业】返回一个整形数组中最大子数组地和——当维度达到二维/*待完善*/
    【作业】返回一个整形数组中最大子数组地和——当数量达到10亿
    软件工程课程周学习进度报告——第三周
    软件工程课程周学习进度报告——第二周
    软件工程第一周开课博客
    【作业】返回一个整形数组中最大子数组地和
    《人月神话》读后感其三——第二个系统问题
    《人月神话》读后感其二——从未考虑过的多人协作问题
  • 原文地址:https://www.cnblogs.com/age0420/p/9441282.html
Copyright © 2020-2023  润新知