0 0

字符编码的相关知识联想到本地二进制代码困惑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个答案 按时间排序 按投票排序

0 0

采纳的答案

一下子问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

相关推荐

Global site tag (gtag.js) - Google Analytics