佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 2755|回复: 34

Binary File的疑问

[复制链接]
发表于 28-11-2009 03:14 PM | 显示全部楼层 |阅读模式
Binary File,顾名思义,就是non human readable file..

之前老师有说过,因为每一台电脑produce出来的binary code都不同,
所以,java需要把source code 换去class file,再又java runtime enviroment把class file convert去适合那台run 这个application的machine code

.net也一样,需要.netframework才能convert去machine code run,


那为什么我download过某些software installer, 是binary file的呢?
不是说binary file是hardware dependent的吗?
software developer compile成binary file后再让我们download,
我们能开得到吗?
谢谢
回复

使用道具 举报


ADVERTISEMENT

发表于 28-11-2009 05:51 PM | 显示全部楼层
binary file 未必可执行.
最基本的例子为Notepad 的.txt (text) file 和 Word 的 .doc (binary)file。
不是Unicode/ASCII 通常就是被列为Binary file.

在Windows 里我们可执行的file 都是使用 PE - Portable Executable. PE 格式就是有根据一定的结构编译成机器码(.NET例外除了PE Header内容都是 Common Language Runtime)执行档.
你误解了一点是Java 编出的虽然是Binary file但不是机器码...机器码可让你的处理器直接执行...Java 编出的是Byte Code. Byte Code -> Virtual Machine -> Machine Code
回复

使用道具 举报

 楼主| 发表于 28-11-2009 08:32 PM | 显示全部楼层
原帖由 megablue 于 28-11-2009 05:51 PM 发表
binary file 未必可执行.
最基本的例子为Notepad 的.txt (text) file 和 Word 的 .doc (binary)file。
不是Unicode/ASCII 通常就是被列为Binary file.

在Windows 里我们可执行的file 都是使用 PE - Portable Ex ...

意思说我把”binary file“和”machine code"弄乱了?

想问的是,binary file是1和0,
machine code也是on 和 off,
有什么不同啊?


还有对了,
想问问exe算是binary file吗?
你说我们download下来的.exe是portable executable,
那么为什么用vb.net写出来的.exe不是portable executable,而是需要.net来execute呢?
回复

使用道具 举报

 楼主| 发表于 28-11-2009 08:34 PM | 显示全部楼层
你误解了一点是Java 编出的虽然是Binary file但不是机器码...机器码可让你的处理器直接执行...Java 编出的是Byte Code. Byte Code -> Virtual Machine -> Machine Code

这一句不是很明白哦。。。
是说如果compile成machine code,
直接可以execute..

那么如果我拿到别台电脑的话呢?
是不是不能呢?(machine dependent)
谢啦
回复

使用道具 举报

发表于 28-11-2009 08:56 PM | 显示全部楼层
原帖由 1234_4321 于 28-11-2009 08:32 PM 发表 意思说我把”binary file“和”machine code"弄乱了? 想问的是,binary file是1和0, machine code也是on 和 off, 有什么不同啊? 还有对了, 想问问exe算是binary file吗? 你说我们download下来的 ...


对...你把二进制码和机器码混淆了. 二进制码储存的可以是Text, images..
其实电脑里的所有资料/执行码....最终形式仍然是二进制码...区别是它们的方法只有数据结构.
.NET 需要有.NET Framework - 类似Java Virtual Machine也是执行 byte code.
虽然说VB.NET 编译出来可以是exe/dll
但不是说所有的EXE都是存100%机器码的...里面也可以封装其他的资源...你可以理解成那个exe呼叫.NET执行里面的.NET Byte code吧

原帖由 1234_4321 于 28-11-2009 08:34 PM 发表 这一句不是很明白哦。。。是说如果compile成machine code, 直接可以execute..那么如果我拿到别台电脑的话呢? 是不是不能呢?(machine dependent)谢啦
machine dependent 其实是指硬体和操作系统的兼容度.相同或可兼容的架构 加上相应的工作环境就可以执行了..

[ 本帖最后由 megablue 于 28-11-2009 09:17 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 29-11-2009 01:11 AM | 显示全部楼层
原帖由 megablue 于 28-11-2009 08:56 PM 发表


对...你把二进制码和机器码混淆了. 二进制码储存的可以是Text, images..
其实电脑里的所有资料/执行码....最终形式仍然是二进制码...区别是它们的方法只有数据结构.
.NET 需要有.NET Framework - 类似Java Vir ...

exe是binary还是machine code?

还是搞不清楚binary 和machine code的分别,
binary 在数学来说只有1和0
machine code也是。。
有什么分别?

还有,
如果我有一个source file,
我在computer A和comupter B compile出来的machine code回是一样的吗?
回复

使用道具 举报

Follow Us
发表于 29-11-2009 02:43 AM | 显示全部楼层
原帖由 1234_4321 于 29-11-2009 01:11 AM 发表
还是搞不清楚binary 和machine code的分别,
binary 在数学来说只有1和0
machine code也是。。
有什么分别?

打个比例,
比如现在我要设计一个新的8bit CPU架构

以下的数字为二进制
00000000 就是 8 bit 也是这个CPU一个cycle最短可读的长度...不可以只读7bit...
前提1段数据代表8bit。

数据段1, 内存的访问地址
数据段2, 代表着数据的类型. 预设 0 为machine code, 1 为Variable
数据段3, 代表着数据的长度乘8bit.
数据段N,代表了数据内容(可以是machine code,也可以是Variable)

比如说你在程式的源码为下
  1. int a = 7;
  2. int b = 257;
  3. if a != b beep();
复制代码
那转换成
int a = 7; 机器码会变成
数据段1: 00000001  这个代表了a 的访问地址是 00000001
数据段2: 00000001  这个代表了以下的数据为Variable
数据段3: 00000010  代表a的长度为 2 x 8 bit 也就是 16bit.
数据段4: 00000111  代表a的内容的第一段为 7
数据段5: 00000000  代表a的内容的第二段为 0
结束(因为数据段3已经告诉了CPU数据段5是最后一段了)

int b = 257; 机器码会变成
数据段6: 00000110  这个代表了b 的访问地址是 00000110
数据段7: 00000001  这个代表了以下的数据为Variable
数据段8: 00000010  代表b的长度为 2 x 8 bit 也就是 16bit.
数据段9: 00000001  代表b的内容的第一段为 1
数据段10: 10000000 代表b的内容的第二段为 256 (此为big endian 编码...如不清楚何为big endian..可略过这行不必理会)
结束(因为数据段3已经告诉了CPU数据段10是最后一段了)



if a != b 机器码会变成
数据段11: 00001011  这个代表了这段机器码的访问地址是 00001011
数据段12: 00000000  这个代表了以下的数据为machine code
数据段13: 00000101  长度为 8 x 8 bit 也就是 64bit.

数据段14: 10000000  比较
数据段15: 00000001  a 的地址
数据段16: 00000110  b 的地址

数据段17: 00000001  如果不相等跳到
数据段18: 00010010  00010010(数据段19)

数据段19: 00000101  发出Beep一声

数据段20: 00000011  无条件跳到
数据段21: 00010100  00010100(数据段22)

数据段22: 00010110 什么都不做

结束(因为数据段3已经告诉了CPU数据段22是最后一段了)

献丑了...概念上是这样...
而且如果你看得懂我想表达什么的话..因该看的出其实binary和machine code本质上是没有分别的...要看的就是你的OS/CPU如何解译那个档案(与其说是档案不如称为一组binary讯息)..

原帖由 1234_4321 于 29-11-2009 01:11 AM 发表
还有,
如果我有一个source file,
我在computer A和comupter B compile出来的machine code回是一样的吗?

只要Compiler和设定一样output出来的exe会是100%相同的

[ 本帖最后由 megablue 于 29-11-2009 03:01 AM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 29-11-2009 03:00 AM | 显示全部楼层
原帖由 megablue 于 29-11-2009 02:43 AM 发表

打个比例,
比如现在我要设计一个新的8bit CPU架构

以下的数字为二进制
00000000 就是 8 bit 也是这个CPU一个cycle最短可读的长度...不可以只读7bit...
前提1段数据代表8bit。

数据段1, 内存的访问地址
数 ...

哇,
你说的这些,都是machine code在cpu怎样行走?

想问
1)那些数据段是在ram里的对吗?
ram储存成多少bit是根据cpu的架构的?

2)你给的例子的cpu架构,是不是和我们现在电脑32bit,64bit一样的?

3)上面提到cpu的架构8bit,minimum bit是8
那64bit的电脑,minimum是64bit/数据段
那不是会浪费storage吗?
越大的bit有什么advantage?32bit被淘汰了。。。






问太多了
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 29-11-2009 03:04 AM | 显示全部楼层
[/quote]
只要Compiler和设定一样output出来的exe会是100%相同的

如果是这样,为什么不直接把source code compile成machine code?
直接拿到别的电脑也可以用了。。

而是要把source compile成byte code,
再利用JVM translate去machine code...
回复

使用道具 举报

发表于 29-11-2009 03:20 AM | 显示全部楼层
原帖由 1234_4321 于 29-11-2009 03:00 AM 发表

哇,
你说的这些,都是machine code在cpu怎样行走?

想问
1)那些数据段是在ram里的对吗?
ram储存成多少bit是根据cpu的架构的?

2)你给的例子的cpu架构,是不是和我们现在电脑32bit,64bit一样的?

3 ...


那是概念...
真正的x86架构比我写的还要复杂些

1)对,就在RAM....那x86(就是现在的PC)来说实际上还有registers (在CPU里的记忆体)

2)我给的概念里的CPU是8bit就是每个cycle读8bit 当一个variable 大于8bit就需要分段来读(这是compiler会处理的) 可访问的记忆体地址也不能大于8bit. 同样情形也发生在32/64bitCPU上.

3) 对....如果在 64bit的系统里, 最少会读64bit. 如果认为浪费记忆体的话.. 可以把多组数据encode在一个64bit的variable里..

比如说 a = 1;
b = 1;
c = 3;
d = 1;

encode 后 (hexadecimal value)
0x0001 (a) 0001 (b) 0003 (c) 0001 (d)

当然解读会慢一点点....
现在的CPU和CPU cache 这样快和大....
其实这步骤是有点多余了...
回复

使用道具 举报

发表于 29-11-2009 03:31 AM | 显示全部楼层
原帖由 1234_4321 于 29-11-2009 03:04 AM 发表


如果是这样,为什么不直接把source code compile成machine code?
直接拿到别的电脑也可以用了。。


而是要把source compile成byte code,
再利用JVM translate去machine code...


因为要做到cross platform/cpu ...
直接compile成machine code有些CPU/OS就不会读了....
比如说ARM和x86的machine code 是不一样的...

java virtual machine 就像是翻译人员...
.把byte code翻译成执行者可明白的语言

还有...java会牵涉到OS的functions...不是每一个OS都有相同的functions...
所以java会做相应的处理另你要跑的functions执行起来在每一个平台的结果都一样...
P/S:
还有一点...题外话..
Sun Microsystem 的最终目的是所有的机器都可以执行Java程式....多么伟大的理想啊不过....虽然java 也有20岁左右了...这个理想还是很勉强下 记得好像有好几个OS...直接以JVM作为核心...可以有效的解决程式的基本的security问题。相信.NET想做的也是如此吧?

[ 本帖最后由 megablue 于 29-11-2009 03:55 AM 编辑 ]
回复

使用道具 举报

发表于 29-11-2009 10:41 PM | 显示全部楼层
hardware > os > software

hardware 再怎么不一样, os 一样就好了吧。。
回复

使用道具 举报

 楼主| 发表于 29-11-2009 11:32 PM | 显示全部楼层
原帖由 megablue 于 29-11-2009 03:31 AM 发表


因为要做到cross platform/cpu ...
直接compile成machine code有些CPU/OS就不会读了....
比如说ARM和x86的machine code 是不一样的...

java virtual machine 就像是翻译人员...
.把byte code翻译成执行者 ...

为什么做不到呢?
我觉得java蛮强的。。
还有,我们的microsoft windows是用什么写出来的呢??


对了,
用vb.net写出来的要用.net才能开。。。
那要怎样写出portable executable的programme出来啊?
回复

使用道具 举报

 楼主| 发表于 29-11-2009 11:34 PM | 显示全部楼层
而且如果你看得懂我想表达什么的话..因该看的出其实binary和machine code本质上是没有分别的...要看的就是你的OS/CPU如何解译那个档案
对...你把二进制码和机器码混淆了. 二进制码储存的可以是Text, images.

这个,我还不是很明白哦。。。

之前你说binary 和machine我混乱了。。
又说本质一样,
我真的乱了
回复

使用道具 举报

发表于 30-11-2009 11:36 AM | 显示全部楼层
所有的file都store in binary form
关键再电脑如何诠义它们

一个exe file , 如果你修改它的binary(例:加一个jpg header上去),电脑就会以jpg方式来开启
回复

使用道具 举报

发表于 30-11-2009 11:01 PM | 显示全部楼层
megablue对low lvl的东西懂蛮多的
可以知道下做IT那一个field的吗?
回复

使用道具 举报


ADVERTISEMENT

发表于 1-12-2009 12:59 AM | 显示全部楼层
原帖由 烛残 于 30-11-2009 11:01 PM 发表
megablue对low lvl的东西懂蛮多的
可以知道下做IT那一个field的吗?

懂一点皮毛而已..刚刚好够骗吃
Software design/development.
回复

使用道具 举报

发表于 1-12-2009 11:00 AM | 显示全部楼层

回复 14# 1234_4321 的帖子

你可以理解成, 你的 hdd 是一张考卷。

里面有题目序号, 问题, 答案。 如

1)  1 + 1 = ?
     2

2) 2 + 2 = ?
     4

而你的老师如何分辨 1)是题目序号, 如何分辨 1 + 1 = ? 是问题, 如何分辨 2 是答案呢?

因为上述全部都是数字阿?

在处理器也是一样, binary 只是一种号码形式, 何时该是 address, 何时是 file, 久看你的instruction 是什么。 以后你有机会接触类是 machine architecture 的, 你就会明白了
回复

使用道具 举报

 楼主| 发表于 1-12-2009 06:48 PM | 显示全部楼层
原帖由 onlylonly 于 1-12-2009 11:00 AM 发表
你可以理解成, 你的 hdd 是一张考卷。

里面有题目序号, 问题, 答案。 如

1)  1 + 1 = ?
     2

2) 2 + 2 = ?
     4

而你的老师如何分辨 1)是题目序号, 如何分辨 1 + 1 = ? 是问题, 如何分辨 2 ...

也就是说binary file里的binary code,和perform在cpu的machine code是一样的,只是看cpu怎样去诠释它们?

如果一个docx得binary file是“111 000”
那在cpu perform时是不是也一样是"on on on off off off"呢?

还有我的课程没有machine architecture的,看来得自己读了。
回复

使用道具 举报

发表于 1-12-2009 09:13 PM | 显示全部楼层

回复 19# 1234_4321 的帖子

CPU 不会执行docx 里面的binary...因为那根本就不是executable machine instructions. CPU只能执行相应的架构里已经定义的指令(其他的binary对CPU来说只能算是data)。在memory里docx得内容也许可以理解为"on on on off off off" 但对电脑来说那只是两种能分辨的状态. 1 是一种状态 (低电阻).... 0 是另一种状 态(高电阻)... binary 因该是最简化的讯息表达了.
就拿人类的嗓音为例..嗓音(binary) 可以是诗句...可以是指令...可以是歌声...也可以在歌声里骂人...也可以是毫无意义的声音...

[ 本帖最后由 megablue 于 1-12-2009 09:23 PM 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 1-12-2025 02:27 AM , Processed in 0.132114 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表