最近在看字符编码的相关知识,又联想到二进制代码的知识,由于本人不是科班出身,对一些二进制代码即本地代码了解不深,所以有几个问题感到很困惑,所以希望懂相关知识的人帮我顺一顺。
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等好多格式吗?
首先,二进制代码没有区别,只是01,区别在于如何解释他们,标志这是代码段,这是数据段等等。
第一个问题:是,跟踪,看内存;
第二个问题:二进制本身无区别,区别在于如何解释
第三个问题:同上
第四个问题:图片视频中也有字符串标记,以图片来说,例如bmp的magicnumber是42 4D,也就是bm,AVI的RIFF的标记52 49 46 46,图片就是矩阵,矩阵里面就是数字,英文字符可以看做数字,ASCII表示数字没有问题,也就不需要考虑编码了,当然大端小端是CPU的事情,不需要涉及这个;至于视频,视频中含有字幕文件,字幕的编码是要考虑的,视频画面本身是图片,图片是矩阵。不论是什么格式的图片,都是一个矩阵而已。socket传输自然是字节数目越少越好的,能清晰的表述其结构最好,所以又诸如jsonProtocol Buffers之类的序列化方案出现。图片传输考虑编码自然也是可以的,不过图片本身就是一个整体,是采用ansii字符编码的,本身就比较节省空间,不考虑图片自身采用的压缩方案。
非常感谢您的回复,恩...编译的时候是怎么处理代码段和数据段的? 比如string s="我是数据"; 这个字符串难道是通过比方说是utf-8编码成2进制然后存储到托管程序集的元数据里的吗? 然后一个方法比如private void method(){} 这个是怎么编译成2进制的?恩...你提到了ANSI这种编码方案,这种编码方案使用的是哪种字符集呢?
@何塞穆里尼奥:
你可以写一个简单的c代码编译为.o后用objdump看一下他的信息,之后将代码段反汇编看一下字符串常量是存储在data段或者.rodata段,编译器不同存放位置可能有差异。你看到的中间文件可能并不是2进制文件的,你要分清二进制存储和二进制文件在逻辑上的差别。
具体内容推荐一本好书:程序员的自我修养—链接、装载与库
@Wang Hui: 你觉得他的回复怎么样?http://www.iteye.com/problems/80672
@何塞穆里尼奥:
挺好的,还是一句话,分清楚二进制存储和二进制文件,这点别搞混了。
@Wang Hui: 你不觉得有的地方他说的跟你说的不一样吗?反驳他!呵呵。其实我更倾向你的说法,可能我说的比较乱,他没理解。
@何塞穆里尼奥:
不一样?没觉的。