请讲解一下这个代码?

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);
原理 谢谢了
...全文
201 14 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
显示字符高位和低位啊

64,682

社区成员

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

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