请讲解一下这个代码?

cba_v 2008-11-04 04:57:18
在论坛上看到的

#include <iostream>
using namespace std;

void char2Hex( char c )
{
unsigned char n = c;
char ch = n/0x10 + '0'; if( ch > '9' ) ch += ('A'-'9'-1);
char cl = n%0x10 + '0'; if( cl > '9' ) cl += ('A'-'9'-1);
cout << ch << cl << ' ';
}

int main()
{
char str[] = "I love 中国";
for( size_t i=0; i <strlen(str); ++i )
char2Hex( str[i] );
cout << endl;
}


能否讲解一下
char ch = n/0x10 + '0'; if( ch > '9' ) ch += ('A'-'9'-1);
char cl = n%0x10 + '0'; if( cl > '9' ) cl += ('A'-'9'-1);
原理 谢谢了
...全文
210 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jessie 2008-11-06
  • 打赏
  • 举报
回复
嗯,就是原理需要解释一下。
我看你有戏 2008-11-06
  • 打赏
  • 举报
回复


一个字符占一个字节

一个汉字两个字节

还是设置个断点调试一下看看吧
char a = 0xD6;
char2Hex(a);



// I l o v e 中 国 ";
//49 20 6C 6F 76 65 20 D6 D0 B9 FA


#include <iostream>
using namespace std;

//也就是将字符的ASCII码对应的10进制数用16进制表示
//由于汉字的一个个字节(汉字由两个字节组成)它的值就有可能大于128,
//所以这这要改为unsigned char,不然中文字符输出为乱码
void char2Hex( unsigned char c )
{
//'0'--'9'可以表示为0--9再加上'0';
//对于大于'9'的字符要用'A'--'F'来表示16进制
//c/0x10取整求前半个字节
char ch = c/0x10 + '0';
if( ch > '9' )
ch += ('A'-'9'-1);

//c%0x10取余求后半个字节
char cl = c%0x10 + '0';
if( cl > '9' )
cl += ('A'-'9'-1);
//输出'0'-'9'和'A'--'F'的字符
cout << ch << cl << ' ';
}
int main()
{
char str[] = "I love 中国";
for( size_t i=0; i <strlen(str); ++i )
char2Hex( str[i] );


char a = 0xD6;
char2Hex(a);//设置断点
cout << endl;
}

cba_v 2008-11-05
  • 打赏
  • 举报
回复
谢谢 解释
但是我主要是想问问 ch = c/0x10 是怎么取前半个字节 cl = c%0x10 取后半字节的
还有就是ch += ('A'-'9'-1)是怎么转换成大写字母的
讲讲 原理 谢谢了
e_sharp 2008-11-05
  • 打赏
  • 举报
回复
UP
jia_xiaoxin 2008-11-05
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

//也就是将字符的ASCII码对应的10进制数用16进制表示
//由于汉字的一个个字节(汉字由两个字节组成)它的值就有可能大于128,
//所以这这要改为unsigned char,不然中文字符输出为乱码
void char2Hex( unsigned char c )
{
//'0'--'9'可以表示为0--9再加上'0';
//对于大于'9'的字符要用'A'--'F'来表示16进制
//c/0x10取整求前半个字节
char ch = c/0x10 + '0'; if( ch > '9' ) ch += ('A'-'9'-1);
//c%0x10取余求前半个字节
char cl = c%0x10 + '0'; if( cl > '9' ) cl += ('A'-'9'-1);
//输出'0'-'9'和'A'--'F'的字符
cout << ch << cl << ' ';
}
int main()
{
char str[] = "I love 中国";
for( size_t i=0; i <strlen(str); ++i )
char2Hex( str[i] );
cout << endl;
}
太乙 2008-11-04
  • 打赏
  • 举报
回复


http://203.208.35.101/search?q=cache:8_8C7boAZXQJ:topic.csdn.net/u/20080821/10/321d4e18-bc1f-43cb-a5f6-52c028011076.html+hqin6+csdn+%E5%9B%BD%E6%A0%87%E7%A0%81&hl=zh-CN&ct=clnk&cd=1&gl=cn&st_usg=ALhdy294KNC5Dg3vBO6lcU5t_m21sPjN2w


http://www.hljrstbb.gov.cn/search.htm

这个是查看汉字的区位码:
中的区位码是5448

转换为国标码就是:(区位码(十进制)的两个字节分别转换为十六进制后加20H得到对应的国标码;)
36+20 = 56
30+20 = 50

所以中的国标码是:5650


内码是汉字交换码(国标码)两个字节的最高位分别加1,即汉字交换码(国标码)的两个字节分别加80H得到对应的内码;

56+80 = D6
50+80 = D0

所以中的内码是d0d6
nullah 2008-11-04
  • 打赏
  • 举报
回复

n/0x10->取16进制的第一位
n%0x10取16进制的第二位

对这两个怎么去的不明白
lzp765 2008-11-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xhs_lh04 的回复:]
n/16->取16进制的第一位,+'0'变为ASC的字符数字, if( ch > '9' ) ch += ('A'-'9'-1); 如果是数字就不变,如果不是则变为大写字母

n%0x10取16进制的第二位 + '0'变为ASC的字符数字; if( cl > '9' ) cl += ('A'-'9'-1); 如果是数字就不变,如果不是则变为大写字母
[/Quote]
解释得很好
cba_v 2008-11-04
  • 打赏
  • 举报
回复
cl += ('A'-'9'-1) 这个是怎么变成大写字母的啊?
n%0x10取16进制的第二位 没有想明白啊?
xhs_lh04 2008-11-04
  • 打赏
  • 举报
回复
n/16->取16进制的第一位,+'0'变为ASC的字符数字, if( ch > '9' ) ch += ('A'-'9'-1); 如果是数字就不变,如果不是则变为大写字母

n%0x10取16进制的第二位 + '0'变为ASC的字符数字; if( cl > '9' ) cl += ('A'-'9'-1); 如果是数字就不变,如果不是则变为大写字母



太乙 2008-11-04
  • 打赏
  • 举报
回复
这个问题我好像回答过嘛~~

这和汉字的内码、国标码等有关,
vk2211 2008-11-04
  • 打赏
  • 举报
回复
0x12AB转换为"12AB"字符串
cyj626 2008-11-04
  • 打赏
  • 举报
回复
显示字符高位和低位啊
第1章:对Spring框架进行宏观性的概述,力图使读者建立起对Spring整体性的认识。   第2章:通过一个简单的例子展现开发Spring Web应用的整体过程,通过这个实例,读者可以快速跨入Spring Web应用的世界。   第3章:讲解Spring IoC容器的知识,通过具体的实例详细地讲解IoC概念。同时,对Spring框架的三个最重要的框架级接口进行了剖析,并对Bean的生命周期进行讲解。   第4章:讲解如何在Spring配置文件中使用Spring 3.0的Schema格式配置Bean的内容,并对各个配置项的意义进行了深入的说明。   第5章:对Spring容器进行解构,从内部探究Spring容器的体系结构和运行流程。此外,我们还将对Spring容器一些高级主题进行深入的阐述。   第6章:我们从Spring AOP的底层实现技术入手,一步步深入到Spring AOP的内核中,分析它的底层结构和具体实现。   第7章:对如何使用基于AspectJ配置AOP的知识进行了深入的分析,这包括使用XML Schema配置文件、使用注解进行配置等内容。   第8章:介绍了Spring所提供的DAO封装层,这包括Spring DAO的异常体系、数据访问模板等内容。   第9章:介绍了Spring事务管理的工作机制,通过XML、注解等方式进行事务管理配置,同时还讲解了JTA事务配置知识。   第10章:对实际应用中Spring事务管理各种疑难问题进行透彻的剖析,让读者对Spring事务管理不再有云遮雾罩的感觉。   第11章:讲解了如何使用Spring JDBC进行数据访问操作,我们还重点讲述了LOB字段处理、主键产生和获取等难点知识。   第12章:讲解了如何在Spring中集成Hibernate、myBatis等数据访问框架,同时,读者还将学习到ORM框架的混用和DAO层设计的知识。   第13章:本章重点对在Spring中如何使用Quartz进行任务调度进行了讲解,同时还涉及了使用JDK Timer和JDK 5.0执行器的知识。   第14章:介绍Spring 3.0新增的OXM模块,同时对XML技术进行了整体的了解。   第15章:对Spring MVC框架进行详细介绍,对REST风格编程方式进行重点讲解,同时还对Spring 3.0的校验和格式化框架如果和Spring MVC整合进行讲解。   第16章:有别于一般书籍的单元测试内容,本书以当前最具实战的JUnit4+Unitils+ Mockito复合测试框架对如何测试数据库、Web的应用进行了深入的讲解。   第17章:以一个实际的项目为蓝本,带领读者从项目需求分析、项目设计、代码开发、单元测试直到应用部署经历整个实际项目的整体开发过程。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧