java magic number_Magic Number

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

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

ff2319e9ae16b5459ee64e690649dc08.png

通常有两种情况

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文件

fbd398ffa133b163d5dabcf9a0e5a15d.png

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

29b5c7d45684fcdcafb78121aa32f7a4.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值