请讲解一下这个代码?

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);
原理 谢谢了
...全文
271 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
  • 打赏
  • 举报
回复
显示字符高位和低位啊
内容概要:本文提出了一种基于“空调-电动汽车”联合虚拟储能的海岛微电网优化调度方法,旨在解决海岛地区可再生能源消纳难与电力供应不稳定的问题。通过充分利用空调负荷的热惰性与电动汽车的灵活充放电能力,构建联合虚拟储能系统,等效替代物理储能装置,实现对风电、光伏等间歇性电源出力波动的平抑。研究建立了融合需求响应机制与多时间尺度调度框架的优化模型,并采用Matlab进行仿真验证。结果表明,该策略能够有效提升微电网对分布式能源的接纳能力,降低系统综合运行成本,增强供电可靠性与能源利用效率。; 适合人群:具备一定电力系统分析、优化建模及Matlab编程基础,从事微电网、综合能源系统、虚拟储能、需求响应等领域研究的科研人员与工程技术人员,特别适合研究生及以上学历的研究者。; 使用场景及目标:①应用于海岛、偏远孤岛等孤立微电网场景,提升可再生能源渗透率与系统韧性;②为高比例新能源接入的配电网提供低成本、高灵活性的虚拟储能解决方案;③实现空调与电动汽车等柔性负荷的协同优化,达成削峰填谷、降低能耗与运行成本的目标; 阅读建议:建议结合Matlab代码深入理解模型构建与求解过程,重点关注虚拟储能建模逻辑、温控负荷动态特性刻画、电动汽车充放电约束处理以及多时间尺度滚动优化的实现机制,可进一步拓展至碳交易、绿证激励等复合政策情景下的优化调度研究。

65,213

社区成员

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

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