Magic Number

今天重学java的时候了解了magic number的相关内容

以前不知道是啥,现在将他的大概意思写下来记录一下

摘自:https://blog.csdn.net/Com_ma/article/details/81980119

通常有两种情况

1.在代码中直接使用到了某个数值

int duration=1000int animDuration=1000*0.618;

如果没有注释说明,0.618这个黄金分割数值就用的很魔幻,导致代码可读性差,修改不方便的问题。

int duration=1000int animHideDuration=1000*0.618int animShowDuration=2000*0.618;

同样的特定数值出现多次应该将其定义为常量

int duration=1000private 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" 应该就是利用这个原理工作的。

posted @ 2020-03-29 21:34  虚青海  阅读(611)  评论(0编辑  收藏  举报