-
字符编码的相关知识联想到本地二进制代码困惑5
最近在看字符编码的相关知识,又联想到二进制代码的知识,由于本人不是科班出身,对一些二进制代码即本地代码了解不深,所以有几个问题感到很困惑,所以希望懂相关知识的人帮我顺一顺。
VS默认是将文本本件(包括cs文件)以utf-8编码方案编码成字节的,举个例子
我们AaBb经过utf-8编码后是E6 88 91 E4 BB AC 41 61 42 62
E6 88 91(代表我) E4 BB AC(代表们) 41(A) 61(a) 42(B) 62(b)
第一个问题:我是不是可以认为将这些16进制转换成2进制后就是 我们AaBb 在计算机的存储方式? 如下
11100110 10001000 10010001(代表我) 11100100 10111011 10101100(代表们) 1000001(A) 1100001(b) 1000010(B) 1100010(b)
如果换成是utf-16编码的 Little_Edian方式(每个字符占2个字节) 就是
11 62(代表我) EC 4E(代表们) 41 00(A) 61 00(a) 42 00(B) 62 00(b)
既然说到了2进制,我就想起了本地代码,从开始学语言的时候就看到各种各样的人说机器语言是01010这种2进制云云...
那么对于C# java先看一下下面
源代码 C#,java
↓
托管代码 .NET:IL(中间语言) JAVA:字节码等
↓
非托管代码(本地代码,二进制代码,机器语言)http://baike.baidu.com/view/2418160.htm
首先看源代码,如果我们只是保存它们,当然就是像上面那样用某种编码方式将其保存成字节
第2个问题:如果我们对源代码进行了编译,使其变成了托管代码,windows下的托管代码叫做可移植执行体,那么这些托管代码肯定也是以2进制形式存储在硬盘里,那么这时的我们编译得来2进制形式与我们直接保存得来的2进制形式的区别在哪里?
第3个问题:当将托管代码编译成本地代码后,啊哈,这就是人们常说的本地2进制代码,这些本地2进制代码与之前的托管2进制代码的区别在哪里? 我知道后者要依赖CLR或jvm,但除此之外呢?
看了上面的提问,感觉我要问的好像是编译的得到的2进制代码与编码得到的2进制代码有什么区别,然后是编译源代码得到的2进制代码与编译托管代码得到的2进制代码有什么区别。
第4个问题:既然编码字符需要考虑编码方案的问题,那么图片视频呢? 就拿.net中socket传输字符串来讲也是需要考虑编码方案的,为什么传输图片就不需要考虑编码呢? 图片不是也有jpg gif等好多格式吗?2012年3月25日 20:56
1个答案 按时间排序 按投票排序
-
采纳的答案
一下子问4个问题,才给5分。。。
第一个问题:我是不是可以认为将这些16进制转换成2进制后就是 我们AaBb 在计算机的存储方式?
A:16进制和2进制都只是数字的一种表示形式,是外在的表现,对内在的实际涵意没有任何影响。
你可以这么理解,机器读2进制比较方便,因为简单。人读16进制比较方便,因为简略。
第2个问题:如果我们对源代码进行了编译,使其变成了托管代码,windows下的托管代码叫做可移植执行体,那么这些托管代码肯定也是以2进制形式存储在硬盘里,那么这时的我们编译得来2进制形式与我们直接保存得来的2进制形式的区别在哪里?
A:这涉及到编译原理的问题,当然这里可以用比较通俗的方式讲就是,你的代码都是用文本方法写的,所以直接保存的也都是字符串,人可以理解是代码,但机器只能识别为字符串。 要想让机器识别成可执行的代码,那就要通过一定的规则转换成机器码。转换后机器就可以执行了,但人去看就是一堆乱码了。
第3个问题:当将托管代码编译成本地代码后,啊哈,这就是人们常说的本地2进制代码,这些本地2进制代码与之前的托管2进制代码的区别在哪里? 我知道后者要依赖CLR或jvm,但除此之外呢?
A:首先,你要明白为什么要分成“托管代码”和“本地代码”,这主要是因为执行平台的不同,导致你要写多种不同的代码来实现相同的功能。为了解决这个问题,就出现了“虚拟机”如JVM,这样的东西。 主要的原理就是你根据“虚拟机”所提供的功能来实现业务逻辑,我为不同的平台开发做不同的“虚拟机”来实现我所提供的功能,这样就可以跨平台了。 剩下的你应该明白一点了吧
第4个问题:既然编码字符需要考虑编码方案的问题,那么图片视频呢? 就拿.net中socket传输字符串来讲也是需要考虑编码方案的,为什么传输图片就不需要考虑编码呢? 图片不是也有jpg gif等好多格式吗?
A:说简单点,因为图片是大文件,可以有自己的文件格式,比如,GIF文件的文件头就是git,ZIP文件的文件头就是'PK'等等,所以它们都可以被很容易的识别。
而字符串不一样,它们很零碎,种类也很多。如GBK,是中文的编码,里面只有中文和英文,而UTF-8是包含了所有的语言。他们实现上就是通过对数字的分段来实现识别不同的文字。当然识别的越多所需要的数字就越大,所需要的存储空间和网络流量就越多,所以在socket里尽量选择合适的编码,来提高性能。
就说这么多吧,希望能给你一点小小的帮助
2012年3月26日 13:58
相关推荐
VC 文件二进制代码阅读器,可用来查看任意文件的二进制数据,分别显示对应的 十进制、十六进制、二进制以及对应的字符。用来分析二进制文件非常方便。
解决labview字符串转换功能不足,将二进制字符串转变为十进制字符串。
详细ascii表,二进制代码和字符之间的对应关系,只有英文字符
由于二进制数在C#中无法直接表示,所以所有二进制数都用一个字符串来表示 例如: 二进制: 1010 表示为 字符串:”1010″ int d = 10; //十进制转二进制字符串 Console.WriteLine(Convert.ToString(d,2)); //...
matlab编码和解码字符串转ascall码再转二进制.m
字符串转二进制码流及解码matlab代码,可用于通信原理实验的仿真,可以将传输中文
VB.NET 字符串与二进制间的转换 VB.NET 字符串与二进制间的转换 VB.NET 字符串与二进制间的转换 VB.NET 字符串与二进制间的转换 VB.NET 字符串与二进制间的转换
NULL 博文链接:https://iszhao.iteye.com/blog/1140899
labview2015版本,将二进制的字符串转换成十进制数值,
汇编语言,输入一个字符,用二进制显示到屏幕上,使用DOSBox验证
C语言二进制字符串与十六进制字符串相互转化,利用MFC框架生成小工具。
RAPTOR是一种基于流程图的可视化程序设计环境。而流程图是一系列相互连接的图形符号的集合,其中每个符号代表要执行的特定类型的指令。这是基于raptor软件制作的一个二进制转十六进制的程序。
本资源是ruby代码,提供了一系列封装好的函数,用于快速进行转换,一个函数搞定,包括如下转换,二进制字符串与hex字符串的互转。二进制字符串与整数互转,包括uint8,uin16,uint32, 以及本地字节序和网络字节序两种...
易语言字节集到二进制互转源码,字节集到二进制互转,字节集到二进制,二进制到字节集
我们都知道在linux下是没有itoa函数的,而又不能通过sprintf实现int转二进制字符串的方式,因此手动编写此代码段,希望可以对大家有帮助。
将任意基本类型转换为二进制字符串的C++代码...
二进制字符串转为长整型[二进制字符串转为长整型]-精品源代码
适用于在通讯时可以用到的实例,16进制转换为二进制,已经测试OK.
具有三种搜索功能。 - 使用十六进制搜索字节 - 搜索纯文本字符串 - 搜索较小的二进制文件
循环的十进制转换为二进制,方便读者学习参考。