16进制与字符间互相转换的原理是什么?
各种高级编程语言都有直接转换的方式,不过不知道是按什么原理转换的.比如说汉字"我"这个字符转换成16进制后是:CED2,程序是先把"我"这个字符按某种规则转换成数字,再把...
各种高级编程语言都有直接转换的方式,不过不知道是按什么原理转换的.
比如说汉字"我"这个字符转换成16进制后是:CED2,程序是先把"我"这个字符按某种规则转换成数字,再把这个数字进行加减乘除等计算后再按某种规则转换成16进制字符CDE2,是这样的吗?
还是每个字符都对应唯一的一个16进制数组,在16进制与字符间互相转换时按"表"查询就可以了?就像c#中(char)(72)=char H,(int)(H)=int 72一样?
还有其他各进制与字符间的转换原理是不是和上面的一样?
有哪位朋友愿意回答我吗? 展开
比如说汉字"我"这个字符转换成16进制后是:CED2,程序是先把"我"这个字符按某种规则转换成数字,再把这个数字进行加减乘除等计算后再按某种规则转换成16进制字符CDE2,是这样的吗?
还是每个字符都对应唯一的一个16进制数组,在16进制与字符间互相转换时按"表"查询就可以了?就像c#中(char)(72)=char H,(int)(H)=int 72一样?
还有其他各进制与字符间的转换原理是不是和上面的一样?
有哪位朋友愿意回答我吗? 展开
展开全部
一、原理:
Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16进制字符H和L,并组合起来得到byte转换到16进制字符串的结果new String(H) + new String(L)。即byte用十六进制表示只占2位。 同理,相反的转换也是将两个16进制字符转换成一个byte,原理同上。
根据以上原理,就可以将byte数组转换为16进制字符串了,当然也可以将16进制字符串转换为byte数组了。
二 、16进制的意义:
1、用于计算机领域的一种重要的数制。
2、对计算机理论的描述,计算机硬件电路的设计都是很有益的。比如逻辑电路设计中,既要考虑功能的完备,还要考虑用尽可能少的硬件,十六进制就能起到一些理论分析的作用。比如四位二进制电路,最多就是十六种状态,也就是一种十六进制形式,只有这十六种状态都被用上了或者尽可能多的被用上,硬件资源才发挥了尽可能大的作用。
3、十六进制更简短,因为换算的时候一位16进制数可以顶4位2进制数。
Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16进制字符H和L,并组合起来得到byte转换到16进制字符串的结果new String(H) + new String(L)。即byte用十六进制表示只占2位。 同理,相反的转换也是将两个16进制字符转换成一个byte,原理同上。
根据以上原理,就可以将byte数组转换为16进制字符串了,当然也可以将16进制字符串转换为byte数组了。
二 、16进制的意义:
1、用于计算机领域的一种重要的数制。
2、对计算机理论的描述,计算机硬件电路的设计都是很有益的。比如逻辑电路设计中,既要考虑功能的完备,还要考虑用尽可能少的硬件,十六进制就能起到一些理论分析的作用。比如四位二进制电路,最多就是十六种状态,也就是一种十六进制形式,只有这十六种状态都被用上了或者尽可能多的被用上,硬件资源才发挥了尽可能大的作用。
3、十六进制更简短,因为换算的时候一位16进制数可以顶4位2进制数。
展开全部
拿汉字的例子来说吧
每个汉字在机器内部的机内码是唯一的
按你说的,“我”的机内码是CED2,这样的话,是要在输出的时候进行转换成汉字,输出包括屏幕和打印机输出等。
一般是按照规则将机内码转换成区位码,然后到区位码这个“表”中去查询即可。
机内码转换:CED2 转换成 十六进制区位码为 2E32
2E32每两位换成十进制的区位码就是4650
也就是说你要把区位码存在一个表中或数组中,然后用区位码进行查询,区位码就行号和列号,这样就可以输出汉字字符了。通常这个区位码表是按自己的需求,来进行优化的,因为可能不需要存所有的汉字,这个表通常叫做字模库或者字形库,都是为了输出用的。
每个汉字在机器内部的机内码是唯一的
按你说的,“我”的机内码是CED2,这样的话,是要在输出的时候进行转换成汉字,输出包括屏幕和打印机输出等。
一般是按照规则将机内码转换成区位码,然后到区位码这个“表”中去查询即可。
机内码转换:CED2 转换成 十六进制区位码为 2E32
2E32每两位换成十进制的区位码就是4650
也就是说你要把区位码存在一个表中或数组中,然后用区位码进行查询,区位码就行号和列号,这样就可以输出汉字字符了。通常这个区位码表是按自己的需求,来进行优化的,因为可能不需要存所有的汉字,这个表通常叫做字模库或者字形库,都是为了输出用的。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
对于高级语言文字服务(双字节文字),转换的方法是两个字节对应字体表中的一个字符。这只是一个一一对应的关系,没什么规律可循。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我字的国标编码是CED2。
中文国标文件按 编码字节顺序排列。
我字为顺序两子节: 0xce 0xd2
中文国标文件 可以混合ascii码。
中文国标文件读法:
loop:
读一字节
如果数值大于0xa0,再读第二字节,两字节构成GB码中文字。goto loop;
如果数值不大于0xa0,它不是GB码,它是ascii码。单字节码。是EOF 则文件结束,否则 goto loop;
-------------------------------------
中文unicode文件:
头部有2-4bytes 特殊码,告诉big endian 或 小endian
全部是双字节编码。我字不是CED2。根据endian决定两字节是否要交换次序。
------------------------------------
其他中文文件: 各有巧妙。
中文国标文件按 编码字节顺序排列。
我字为顺序两子节: 0xce 0xd2
中文国标文件 可以混合ascii码。
中文国标文件读法:
loop:
读一字节
如果数值大于0xa0,再读第二字节,两字节构成GB码中文字。goto loop;
如果数值不大于0xa0,它不是GB码,它是ascii码。单字节码。是EOF 则文件结束,否则 goto loop;
-------------------------------------
中文unicode文件:
头部有2-4bytes 特殊码,告诉big endian 或 小endian
全部是双字节编码。我字不是CED2。根据endian决定两字节是否要交换次序。
------------------------------------
其他中文文件: 各有巧妙。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
理解很简单的,“我”在计算机仍然是16进制代码,没有你我的概念,都已经提前转换好的(按照默认内码),除非手动强制编码转换,否则就由输入系统、编译系统自动转换好。
其他进制也是有16进制(当然存储时按2进制)转换而来的,不信你打印一下转换表就可以看出来。
其他进制也是有16进制(当然存储时按2进制)转换而来的,不信你打印一下转换表就可以看出来。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询