2.1 获取字符( 8 位)的上四位和下四位 ... 1

2.2 获取字符(上表中的 图形 )所对应的 十六进制字符 ... 1

2.3 获取字符对应的十六进制字符的第二种方法(傻瓜式) ... 1

2.4 递归的方法获取字符对应的二进制字符 ... 1

第1节 ASCII 码对照表

ASCII American Standard Code for Information Interchange ,美国信息互换标准代码, ASC Ⅱ)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准 ISO/IEC 646

ASCII 第一次以规范标准的型态发表是在 1967 年,最后一次更新则是在 1986 年,至今为止共定义了 128 个字符,其中 33 个字符无法显示(这是以现今操作系统为依归,但在 DOS 模式下可显示出一些诸如笑脸、扑克牌花式等 8-bit 符号), 且这 33 个字符多数都已是陈废的控制字符 ,控制字符的用途主要是用来操控已经处理过的文字,在 33 个字符之外的是 95 个可显示的字符,包含用键盘敲下空白键所产生的空白字符也算 1 个可显示字符(显示为空白)。

1.1 ASCII 控制字符

第2节 字符的进制转换

2.1 获取字符( 8 位)的上四位和下四位

举例 1 :字符 ‘a’ ,它对应的二进制(或称 ASCII 码)为 0110 0001 ,该二进制的上四位为 0110 ,下四位为 0001 ,这两个二进制对应的十六进制为 6 1

举例 2 :字符 ‘d’ ,它对应的二进制(或称 ASCII 码)为 0110 0100 ,该二进制的上四位为 0110 ,下四位为 0100 ,这两个二进制对应的十六进制为 6 4

由于二进制不好输出,这里通过调试查看 char_buff 的结果:字符 ’o’ 的上四位 a=’\x6’ ,下四位 b=’\xf’ 。其中 \x 表示 16 进制,也就是说 a 16 进制数为 6 b 的十六进制数为 f ,各自对应的十进制数为 6 15

2.2 获取字符(上表中的 图形 )所对应的 十六进制字符

举例 3 :(续例 1 )字符 ‘a’ ,它对应的 16 进制为 61 ,若要在屏幕输出 两个字符 6 1 ,需要将 ‘a’ 转化为两个字符,这两个字符的 ASCII 码为 0011 0110 0011 0001

举例 4 :字符 ‘o’ ,它对应的 16 进制为 6F ,若要在屏幕输出两个字符 6 F ,需要将 ‘o’ 转化为两个字符,这两个字符的 ASCII 码为 0011 0110 0100 0110

unsigned char* Char2Hex(unsigned char ch){

unsigned char byte[2],i;

static unsigned char szHex[2];

byte[0] = ch/16;  // 获得 ch 字符( 8 位)的上四位

byte[1] = ch%16;  // 获得 ch 字符( 8 位)的下四位

for(i=0; i<2; i++){

if(byte[i] >= 0 && byte[i] <= 9)

szHex[i] = '0' + byte[i];

szHex[i] = 'a' + byte[i] - 10;

return &szHex[0];

void main (){

unsigned char* char_buff;

char_buff = Char2Hex('o');

cout<<char_buff[0]<<endl;

cout<<char_buff[1]<<endl;

system("pause");

2.3 获取字符对应的十六进制字符的第二种方法(傻瓜式)

根据 2.1 节的获取 8 进制字符的上 4 位、下 4 位的方法,我联想到了一个新的方法来获取其 16 进制的字符。结果同 2.2 节,但原理很简单:

举例 5 :字符 ‘o’ ,它的 ASCII 码为 0110 1111 ,上四位 0110 ,下四位 1111 这两个二进制对应的 十进制 分别为 6 15 只需将 6 15 通过一个 unsigned char 数组进行映射即可获得两个字符 6 F

这个 unsigned char 数组的构造为: char_map[17] = "0123456789ABCDEF"; 具体代码如下。结果与 2.2 节一致。

// 用一个字符数组做映射

unsigned char char_map[17] = "0123456789ABCDEF";

//unsigned char char_map[16] = {'0','1','2','3','4','5','6','7','8','9',

//                                       'A','B','C','D','E','F'};

// 核心函数 仍然是 2.1 节中的代码

unsigned char* Char2(unsigned char ch){

static unsigned char szHex[2];

szHex[0] = ch/16;

szHex[1] = ch%16;

return &szHex[0];

// 调试部分

void main (){

unsigned char* char_buff;

char_buff = Char2('o');

// 这里将 char 类型的 char_buff 当数使用

cout<<char_map[char_buff[0]]<<endl;

cout<<char_map[char_buff[1]]<<endl;

system("pause");

2.4 递归的方法获取字符对应的二进制字符

举例 6 :字符 ‘a’ ,它对应的 ASCII 码为 0011 0110 ,没错我就是要在屏幕上输出 0011 0110 !!!

具体的代码贴在下面,注释写的很清楚,需要的话可以仔细研究一下。

其实这与“中序二叉树遍历“算法类似

// 核心函数

// ch: 传入的字符 ; n: 除数,n:除数,它等于当前ch可能到的最大值的根;

// m: 指针,用于索引数组 , 初始值为 0; out_bin[] :输出的二进制字符串

void Char2Bin(unsigned char ch,int n, int *m, unsigned char out_bin[]){

if (n>4){

// ch/n ch%n 是为 4 位的二进制 ( 最大值可以用 4 位的二进制表示,实际它还是 unsigned char 类型的,占用 8 )

// 要获取 4 位二进制的上 2 位和下二位,除数 n=2^(4/2)=4

Char2Bin(ch/n,n/4,m,out_bin);

Char2Bin(ch%n,n/4,m,out_bin);

else if (n>2){

// ch/n ch%n 2 位的二进制

// 要获取它的上 1 位和下一位,除数 n=2^(2/2)=2

Char2Bin(ch/n,n/2,m,out_bin);

Char2Bin(ch%n,n/2,m,out_bin);

else{

// 当前 ch 2 位的二进制 , 只需将其转化为 0 1 即可

out_bin[(*m)++] = ch/2 + '0';

out_bin[(*m)++] = ch%2 + '0';

return;    // 到这里必须返回,否则都会运行最后一行再返回,造成冗余

out_bin[8] = '\0'; // 字符数组最后以 '\0' 结尾就会变成字符串 ,

// 可以参考 http://www.runoob.com/cplusplus/cpp-strings.html

// 调试部分

void main (){

unsigned char out[9];

int m = 0;

Char2Bin('a',16,&m,out); // 当前 ch 8 位的二进制 , 要获取 ch 的上 4 位和下 4 , 所以除数 n=2^(8/2)=16

cout << out << endl;

system("pause");

如果你觉得文章写得还不错, 欢迎打赏、关注、收藏本站。
对于文章内容,博主尽量做到真实可靠,并对所引用的内容附上原始链接。但也会出错,如有问题,欢迎留言交流~
若标题前没有“[转]”标记,则代表该文章为本人(司徒鲜生)所著, 转载及引用请注明出处,谢谢合作!
本站首页:
http://www.cnblogs.com/stxs/ 最新博客见CSDN: https://blog.csdn.net/qq_45887327