最近接到一个请求:解决一个二进制文件的内容。/home/work/files#lltotal312-rw------@1honvidstaff30K72414:5215158-rw------1honvidstaff46K72414:5362770-rw-------@1honvidstaff73K72411:268686584vi可以看出有一堆乱码如下。^_<8b>^H^@^@^@^@^@^D^@í?^G`^\I<96>%&/mê{^?J?J×àt?^H<80>`^S$………………unzip/home/work/files#unzip15158Archive:15158End-of-central-directorysignaturenotfound。该文件不是zip文件,或者它构成了一个多部分存档的磁盘。在后一种情况下,中心目录和zipfile注释将在此存档的最后一个磁盘上找到。解压缩:在15158或15158.zip之一中找不到zipfile目录,并且找不到15158.ZIP,period.gzip/home/work/files#gzip-d15158gzip:15158:unknownsuffix--ignortar/home/work/files#tar-xzvf15158tar:Unrecognizedarchiveformattar:Errorexitdelayedfrompreviouserrors.lzma/home/work/files#lzma文件格式错误-d15158lzma:15158:Fileformatnotrecognizedxz/home/work/files#xz-d15158xz:15158:Fileformatnotrecognizedjar看的有文章说可以使用jar指令进行解压。/home/work/files#jarxvf15158java.util.zip.ZipException:zipENDheadernotfoundatjava.base/java.util.zip.ZipFile$Source.zerror(ZipFile.java:1470)atjava.base/java.util.zip.ZipFile$Source.findEND(ZipFile.java:1371)在java.base/java.util.zip.ZipFile$Source.initCEN(ZipFile.java:1378)在java.base/java.util。zip.ZipFile$Source.(ZipFile.java:1209)在java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1172)在java.base/java.util.zip。ZipFile$CleanableResource.(ZipFile.java:719)在java.base/java.util.zip.ZipFile.(ZipFile.java:239)在java.base/java.util.zip.ZipFile。(ZipFile.java:169)在java.base/java.util.zip.ZipFile。(ZipFile.java:140)在jdk.jartool/sun.tools.jar.Main.extract(Main.java:1389)atjdk.jartool/sun.tools.jar.Main.run(Main.java:410)atjdk.jartool/sun.tools.jar.Main.main(Main.java:1681)7za之后想着要伊个大而完整的工作方法解去。可以使用P7ZIP。我在Alpine中使用测试。安装步骤如下:/home/work/files#apkaddp7zip(1/1)Installingp7zip(16.02-r3)Executingbusybox-1.29.3-r10.triggerOK:84MiBin64packages#安装包不小/home/work/files#7za7-Zip(a)[64]16.02:版权所有(c)1999-2016IgorPavlov:2016-05-21p7zip版本16.02(locale=C.UTF-8,Utf16=on,HugeFiles=on,64bits,4CPUsIntel(R)Core(TM)i5-7360UCPU@2.30GHz(806E9),ASM,AES-NI)Usage:7za[...][...][<@listfiles...>]a:将文件添加到存档b:基准测试d:从存档中删除文件e:从存档中提取文件(不使用目录名)h:计算文件的哈希值i:显示有关支持格式的信息l:列出存档的内容rn:重命名存档中的文件t:测试存档的完整性u:将文件更新到存档x:使用完整路径提取文件--:停止开关解析-ai[r[-|0]]{@listfile|!wildcard}:包含档案-ax[r[-|0]]{@listfile|!wildcard}:排除档案-ao{a|s|t|u}:设置覆盖模式-an:禁用archive_name字段-bb[0-3]:设置输出日志级别-bd:禁用进度指示器-bs{o|e|p}{0|1|2}:设置输出/错误/进度行的输出流-bt:显示执行时间统计信息-i[r[-|0]]{@listfile|!wildcard}:包括文件名-m{Parameters}:设置压缩方法-mmt[N]:设置CPU线程数-o{Directory}:设置输出目录-p{Password}:设置密码-r[-|0]:递归子目录-sa{a|e|s}:设置存档名称模式-scc{UTF-8|WIN|DOS}:设置控制台输入/输出的字符集-scs{UTF-8|UTF-16LE|UTF-16BE|WIN|DOS|{id}}:为列表文件设置字符集-scrc[CRC32|CRC64|SHA1|SHA256|*]:为x、e、h命令设置哈希函数-sdel:压缩后删除文件-seml[.]:通过电子邮件发送存档-sfx[{name}]:创建SFX存档-si[{name}]:从标准输入读取数据-slp:设置LargePages模式-slt:显示l(列表)命令的技术信息-snh:将硬链接存储为链接-snl:将符号链接存储为链接-sni:存储NT安全信息-sns[-]:存储NTFS备用流-so:将数据写入标准输出-spd:禁用文件名的通配符匹配-spe:消除提取命令的根文件夹重复-spf:使用完全限定的文件路径-ssc[-]:设置区分大小写模式-ssw:压缩共享文件-stl:从最近修改的文件设置存档时间戳-stm{HexMask}:设置CPU线程关联掩码(十六进制数)-stx{Type}:排除存档类型-t{Type}:设置存档类型-u[-][p#][q#][r#][x#][y#][z#][!newArchiveName]:更新选项-v{Size}[b|k|m|g]:创建卷-w[{path}]:分配工作目录。空路径表示临时目录-x[r[-|0]]{@listfile|!wildcard}:排除文件名-y:assumeYesonallqueries重点来了/home/work/files#7zax151587-Zip(a)[64]16.02:版权所有(c)1999-2016IgorPavlov:2016-05-21p7zip版本16.02(locale=C.UTF-8,Utf16=on,HugeFiles=on,64bits,4CPUsIntel(R)Core(TM)i5-7360UCPU@2.30GHz(806E9),ASM,AES-NI)正在扫描驱动器以获取档案:1个文件,74830字节(74KiB)提取存档:15158警告:15158无法将文件打开为[zip]存档文件打开为[gzip]存档--路径=15158打开警告:无法将文件打开为[zip]存档类型=gzipHeaders大小=10EverythingisOkArchivewithWarnings:1Size:149629Compressed:74830一开始以为解压不成功,一看有WARNING。仔细一看,原来是有一个Type=gzip。是一个Gzip文件。那么为什么刚才尝试使用gzip命令失败了呢?确认添加了后缀为.gz的文件后,使用gzip-d命令解压成功。应该是gzip脚本没有对文件内容进行类型校验,只是匹配文件名后缀。使用PHP读取内容成功$filename='/home/work/files/15158';$file=file_get_contents($文件名);echogzdecode($文件名);输出文件内容成功。扩展后看到一个封装的判断文件类型的工具类。思路是判断文件头信息。通过本地方法$filename='/home/work/files/15158';//这个函数打开一个魔法数据库并返回它的资源。$handle=finfo_open(FILEINFO_MIME_TYPE);//返回一个文件的信息$fileInfo=finfo_file($handle,$filename);finfo_close($handle);var_dump($fileInfo);##输出内容string(18)"application/x-gzip"传递头信息的前提是知道每个文件的头信息type:可以查询文件头信息库$file=@fopen('/home/work/files/15158',"rb");if(!$file)thrownew\Exception("filerefuse!");$bin=恐惧($文件,15);//只读15个字节,不同的文件类型,头信息不同。fclose($file);//定义文件头信息映射$types=[["FFD8FFE1","jpg"],["89504E47","png"],["255044462D312E","pdf"],["504B0304","zip"],["52617221","rar"],["1F8B08","gzip"]];foreach($typesas$type){$blen=strlen(pack("H*",$type[0]));//获取文件头的字节数$tbin=substr($bin,0,intval($blen));///需要比较文件头的长度if(strtolower($type[0])==strtolower(array_shift(unpack("H*",$tbin)))){return$type[1];}}返回“未知”;