
魔数这个词在不同领域代表不同的含义。在计算机领域,魔数有两个含义,一指用来判断文件类型的魔数;二指程序代码中的魔数,也称魔法值。
- 中文名称 魔数
- 外文名称 magic number
- 别名 魔法数
定义
- 所谓魔数和魔字符串就是指在代码中出现但没有解释来自的数字常量或字符串,又称魔法值。如果在某个程序中你使用了魔数,那么在几个月或几年后你将很可能不知道它的含义是什么。
- 大多数情况下,我们都是通过扩展名来识别一个文件的类型的,比如我们看到一个.txt类型的文件我们就知道他是一个纯文本文件。但是,扩展名是可以修改的,当一个文件的扩展名被修改过,识台起针部别一个文件的类型就用到了我们提到的"魔数"。很多类型的文件,其起始的几个字节的内容是固定的(360百科或是有意填充,或是本就如此)这几个字节的内容也被称为魔数,因为根据这几个字节的内容就可以确定文件类型。有了这些魔术数字,我们就可以很方便的区别不同的文件。
实例解释
代码中的魔数
譬如一个很简单的根据职位计算薪水的方法
在这个方法里面,"Programmer","Tester"和"Analyst"是所谓的魔字符串(Magic String),而500, 700,800和1000就是秋触合找易所谓的魔数(Magic Number)了。 咋一看,代码这样写也没有什么问题,但是,仔细思考一下就会发现,如果这种随手捻来的字符串和数字散布于程序当中,随处可见的话,是会有很多弊病的。我们先来分析三个魔字符串。虽然三个Magic String的意义很明显,并不影响到代码的可读性,但是这样却增加了出错的概率,并且忽略了具体的语义环境。我们很容易就会想到,像"Programmer"这个单词散布在多个方法中,一个大小写的企手带顶心笔误就会产生bug。同时,"Programmer"在计算薪水的方法中代表着职位,但是在统计公司订阅的杂志的方法呀四跑互中,也许就要代表一本杂志的名称了。然而这种语义环境是无法通过一个单纯的"Programmer"就能体现出来的。
Magic Number
而Magic Number的问题就更大了,首先是影响了代码的可读性,谁会知道500和800是薪水基数,700是补贴.而且更糟糕的是,如果杆米巴一府镇始河薪水基数发生改变的时候,那么就得找人把这些500,700,800的燃色婷些径烈如知致热印数字找出来一个一个地update,那可是一件够郁闷的事情了。
如果我们拥有一协均一基个常量定义的interface,代码就会变漂亮起来了:
从以上的分析,在一个Project里面,避免使用魔数哪创注(Magic Nu井获守经况mber)和魔字符串(Magic String)是相当必要的。通过定义的常量去access特定的字符串和数字也已经是软件开发的standar材缺源d。那么是不是所有的数字和字符串都应该定义成常量呢。或许有朋友会认为所有的数字和字符串都益包信析备战块单息应该定义成常量,但是我觉得,每个字符串确实是应该定义成常量的,但是对于数字而言,如果数字本身的语义没有得到延伸,那么就不应该定义成常量。譬如数组的index就不应该定义成变量。 像这样的代码:
你一定会觉得这样的代码就是画蛇添足, 因为ONE就是1,它没有其他特别的含义,不像上面代码中的500和700。而且如果真的要这样定义的话,出现了有上百个元素的数组的时候,那么你就得定义上百个没有任何意义的常量了。这样会大大降低代码质量,浪费内存空间。
上防是轴员日架 在程序中除了0,1,2这几个有特殊用处的数字,其它的都要声明为常量。总之,任何策略的使用,还是一个度最重要。
判断文件类型的魔数
很多类型的文件,其起始的几个字节的同席士内容是固定的(或是有意填充,或是本就如此)。因此这几个字节的内容也被称为魔数 (magic number),因为根据这几个字节的内容就可以确定文件类型。
例如
- FreeBSD 攻鱼名介还段坐定散上 ELF 文件的 magic number 就是文件的前四个字节依次为"7f 45 要据4c 46",对应的ascii字符串即 "^?ELF"。
- tar 文件的 magic number 是从第257个字节起为 "ustar"。
- PE文件中,在DOS-根之后是一个32度留另族妒位的签名以及魔数0x000棉务敌题04550 (IMAGE_NT_SIGNATURE) 意为"NT签名",也就是PE签味言照资孩师名;十六进制数45和50分别代表ASCII码字母P和E,它使任何PE文件都是一个有效的MS-DOS可执行文件。
- Java的.class文件,开头的4个字节0xCAFEBABE,这是Java初代开发小组最喜欢的一种咖啡Peet's Coffee的爱称。
Unix 命令 "file" 应该就是利用这个原理工作的。Linux操作系统下没有文件扩展名,判断文件类型凭借的就是文件的内容,也就是魔数。
核学定义
魔数是稳定核素"幻数"的另称。