今天重学java的时候了解了magic number的相关内容
以前不知道是啥,现在将他的大概意思写下来记录一下
摘自:https://blog.csdn.net/Com_ma/article/details/81980119
通常有两种情况
1.在代码中直接使用到了某个数值
int duration=1000; int animDuration=1000*0.618;
如果没有注释说明,0.618这个黄金分割数值就用的很魔幻,导致代码可读性差,修改不方便的问题。
int duration=1000; int animHideDuration=1000*0.618; int animShowDuration=2000*0.618;
同样的特定数值出现多次应该将其定义为常量
int duration=1000; private static final int GOLDEN_SECTION=0.618; int animHideDuration=1000*GOLDEN_SECTION; int animShowDuration=2000*GOLDEN_SECTION;
2.用来标志文件的特性
一个文件里面的内容到底是啥?单纯的Windows用户一般是看后缀。但是后缀这个东西说改就改,不可靠。所以,最保险的还是把文件类型信息写到文件里面,通常来说,也就是写到文件开头的那几个字节。这也是现在最方便,最快捷的用来辨别一个文件真实内容的方法。这个运用是特别广泛的,常见的比如
1、Java class文件的魔数
每一个Java Class文件都是以0x CAFEBABE开头的。我们直接打开一个class文件
2、文本文件的BOM
比如说,对于文本文件,开头的几个字节可以叫做BOM(Byte Order Mark),它的作用是用来标记文本文件内部是用的哪种Unicode编码,以及其字节码顺序。UTF-8,UTF-16BE,UTF-16LE等等各种Unicode编码都有自己独一无二的BOM。一般的文本编辑器也都支持 BOM。这样就不会出现乱码了。
5、FreeBSD 上 ELF 文件的 magic number 就是文件的前四个字节依次为"7f 45 4c 46",对应的ascii字符串即 "^?ELF"。
6、tar 文件的 magic number 是从第257个字节起为 "ustar"。
7、PE文件中,在DOS-根之后是一个32位的签名以及魔数0x00004550 (IMAGE_NT_SIGNATURE)(意为“NT签名”,也就是PE签名;十六进制数45和50分别代表ASCII码字母P和E,它使任何PE文件都是一个有效的MS-DOS可执行文件。等等
一般而言,硬盘数据恢复软件(如 EasyRecovery),就是靠分析磁盘上的原始数据,然后根据文件幻数来试图匹配文件格式,从而尝试识别出磁盘中那些已经从文件系统登记表中删除的文件(真实的文件内容可能没有被覆盖)。但是这种方法不是100%精确,因为磁盘中数据的随机性也很大,很多没有意义的字符串,可能被误认为是有效的幻数,从而造成回复出无效/错误的文件。(可以在EasyRecovery中自己定义文件的幻数然后让它帮你回复,不过常用的文件格式它都有记录)
通常在应用开发中,文件读写也可能使用文件的幻数。例如读取文件时,用它来判断文件的格式是否匹配.如果不匹配则报告错误不处理文件,或者尝试读取文件的幻数标记来识别。常见的例子。例如,把一个bmp图像文件的扩展名改名为png,可能有些图像浏览/编辑软件提示:类型错误,加载失败,但是有的软件却可以识别并读出,并提示格式跟扩展名不匹配。
所以我们可以推测命令 "file" 应该就是利用这个原理工作的。
原文:https://www.cnblogs.com/xqher/p/12595064.html