首页 新闻 赞助 找找看

字符编码的相关知识联想到本地二进制代码困惑

0
悬赏园豆:10 [已解决问题] 解决于 2013-12-24 09:19

最近在看字符编码的相关知识,又联想到二进制代码的知识,由于本人不是科班出身,对一些二进制代码即本地代码了解不深,所以有几个问题感到很困惑,所以希望懂相关知识的人帮我顺一顺。
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等好多格式吗?

何塞穆里尼奥的主页 何塞穆里尼奥 | 初学一级 | 园豆:126
提问于:2012-03-25 20:43
< >
分享
最佳答案
0

首先,二进制代码没有区别,只是01,区别在于如何解释他们,标志这是代码段,这是数据段等等。

第一个问题:是,跟踪,看内存;

第二个问题:二进制本身无区别,区别在于如何解释

第三个问题:同上

第四个问题:图片视频中也有字符串标记,以图片来说,例如bmp的magicnumber是42 4D,也就是bm,AVI的RIFF的标记52 49 46 46,图片就是矩阵,矩阵里面就是数字,英文字符可以看做数字,ASCII表示数字没有问题,也就不需要考虑编码了,当然大端小端是CPU的事情,不需要涉及这个;至于视频,视频中含有字幕文件,字幕的编码是要考虑的,视频画面本身是图片,图片是矩阵。不论是什么格式的图片,都是一个矩阵而已。socket传输自然是字节数目越少越好的,能清晰的表述其结构最好,所以又诸如jsonProtocol Buffers之类的序列化方案出现。图片传输考虑编码自然也是可以的,不过图片本身就是一个整体,是采用ansii字符编码的,本身就比较节省空间,不考虑图片自身采用的压缩方案。

收获园豆:10
zsounder | 老鸟四级 |园豆:2819 | 2012-03-26 01:10

非常感谢您的回复,恩...编译的时候是怎么处理代码段和数据段的? 比如string s="我是数据"; 这个字符串难道是通过比方说是utf-8编码成2进制然后存储到托管程序集的元数据里的吗?  然后一个方法比如private void method(){} 这个是怎么编译成2进制的?恩...你提到了ANSI这种编码方案,这种编码方案使用的是哪种字符集呢?

何塞穆里尼奥 | 园豆:126 (初学一级) | 2012-03-26 09:24

@何塞穆里尼奥: 

你可以写一个简单的c代码编译为.o后用objdump看一下他的信息,之后将代码段反汇编看一下字符串常量是存储在data段或者.rodata段,编译器不同存放位置可能有差异。你看到的中间文件可能并不是2进制文件的,你要分清二进制存储和二进制文件在逻辑上的差别。

具体内容推荐一本好书:程序员的自我修养—链接、装载与库

zsounder | 园豆:2819 (老鸟四级) | 2012-03-26 10:11

@Wang Hui: 你觉得他的回复怎么样?http://www.iteye.com/problems/80672

何塞穆里尼奥 | 园豆:126 (初学一级) | 2012-03-26 16:22

@何塞穆里尼奥: 

挺好的,还是一句话,分清楚二进制存储和二进制文件,这点别搞混了。

zsounder | 园豆:2819 (老鸟四级) | 2012-03-26 17:09

@Wang Hui: 你不觉得有的地方他说的跟你说的不一样吗?反驳他!呵呵。其实我更倾向你的说法,可能我说的比较乱,他没理解。

何塞穆里尼奥 | 园豆:126 (初学一级) | 2012-03-26 21:42

@何塞穆里尼奥: 

不一样?没觉的。

zsounder | 园豆:2819 (老鸟四级) | 2012-03-26 21:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册