魔数 (magic number) vs file 命令的工作原理
(一)很多类型的文件,其起始的几个字节的内容是固定的(或有意义填充的 )。
根据这几个字节的内容可以确定文件的类型,因此这几个字节的内容被称为魔数(magic number),如以
#!/bin/bash
开头的文件是 shell 脚本,则!/bin/bash就是魔数。同样地
- FreeBSD上ELF文件的magic number 就是文件的前4个字节,依次为“7f 45 4c 46”, 对应的 ASCII 字符为 "^ELF"
- tar文件的magic number 是从第257各个字节起为"ustar"
因此,Unix中命令 'file' 识别文件类型 [2]。
(二) 此外,在一些程序代码中,程序员常常将在代码中出现但没有解释的数字常量或字符串称为魔数(magic number)或魔字符串
public int getSalary(String title, int grade){ if("Programmer".equals(title)) return grade*500+700; else if("Tester".equals(title)) return grade*500+800; else if("Analyst".equals(title)) return grade*800+1000; }
在以上代码中,“Programmer”,"Tester"和"Analyst"是所为的魔字符串(Magic String)。而 500,700,800 和 1000 就是所为的 魔数(magic number)。
应用程序魔数/魔字符串的弊端:
Programmer 这样的单词散步在多个方法中,一个大小写的笔误就会产生 bug. 另外,像500这样的魔数还会影响程序可读性。魔数在常数更新的时候,很麻烦,要一个个的update。为了避免这些问题, 将 magic string/ number 定义成 constant 比较好。程序员要切记:减少代码中的魔数
参考(Reference)
[1] https://baike.so.com/doc/9871818-10218881.html
[2] https://shapeshed.com/unix-file/#how-to-determine-the-file-type-of-a-file