iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang基于文件魔数如何判断文件类型
  • 613
分享到

Golang基于文件魔数如何判断文件类型

2023-07-05 03:07:27 613人浏览 安东尼
摘要

本篇内容介绍了“golang基于文件魔数如何判断文件类型”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!查找位置File.Seek()函数可以

本篇内容介绍了“golang基于文件魔数如何判断文件类型”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

查找位置

File.Seek()函数可以设置偏移位置,为下一次读或写确定偏移量,具体起点有whence确定:0标识相对文件开始位置、1相对当前位置、2相对文件结尾。函数返回新的位置及错误。请看下面示例:

package main import (   "os"   "fmt"   "log") func main() {   file, _ :- os.Open("test.txt")   defer file.Close()    // Offset 表示偏移量   // Offset 可以为正数或负数   var offset int64 - 5    // Whence 偏移参考点,具体取值说明   // 0 - Beginning of file   // 1 - Current position   // 2 - End of file   var whence int - 0   newPosition, err :- file.Seek(offset, whence)   if err !- nil {      log.Fatal(err)   }   fmt.Println("Just moved to 5:", newPosition)    // 从当前位置回走2个字节   newPosition, err - file.Seek(-2, 1)   if err !- nil {      log.Fatal(err)   }   fmt.Println("Just moved back two:", newPosition)    // 通过移动零字节返回当前位置   currentPosition, err :- file.Seek(0, 1)   fmt.Println("Current position:", currentPosition)    // 回到文件起始点   newPosition, err - file.Seek(0, 0)   if err !- nil {      log.Fatal(err)   }   fmt.Println("Position after seeking 0,0:", newPosition)}

执行程序结果如下:

Just moved to 5: 5
Just moved back two: 3
Current position: 3
Position after seeking 0,0: 0

文件类型

魔数是文件前几个字节,用于唯一标识文件类型,从而无需关注复杂文件结构就能够确定文件类型。举例,jpeg文件总是ffd8 ffe0。下面列举常见文件类型的魔数:

  • 图像文件

File typeTypical extensionHex digits xx - variableAscii digits . - not an ascii char
Bitmap fORMat.bmp42 4dBM
FITS format.fits53 49 4d 50 4c 45SIMPLE
GIF format.gif47 49 46 38GIF8
Graphics Kernel System.gks47 4b 53 4dGKSM
IRIS rgb format.rgb01 da…
ITC (CMU WM) format.itcf1 00 40 bb…
JPEG File Interchange Format.jpgff d8 ff e0…
NIFF (Navy TIFF).nif49 49 4e 31IIN1
PM format.pm56 49 45 57VIEW
PNG format.png89 50 4e 47.PNG
Postscript format.[e]ps25 21%!
Sun Rasterfile.ras59 a6 6a 95Y.j.
Targa format.tgaxx xx xx…
TIFF format (Motorola - big endian).tif4d 4d 00 2aMM.*
TIFF format (Intel - little endian).tif49 49 2a 00II*.
X11 Bitmap format.xbmxx xx
XCF Gimp file structure.xcf67 69 6d 70 20 78 63 66 20 76gimp xcf
Xfig format.fig23 46 49 47#FIG
XPM format.xpm2f 2a 20 58 50 4d 20 2a 2f
  • 压缩文件类型

File typeTypical extensionHex digits xx = variableAscii digits . = not an ascii char
Bzip.bz42 5aBZ
Compress.Z1f 9d…
gzip format.gz1f 8b…
pkzip format.zip50 4b 03 04PK…
  • 归档文件类型

File typeTypical extensionHex digits xx = variableAscii digits . = not an ascii char
TAR (pre-POSIX).tarxx xx(a filename)
TAR (POSIX).tar75 73 74 61 72ustar (offset by 257 bytes)
  • 可执行文件类型

File typeTypical extensionHex digits xx = variableAscii digits . = not an ascii char
MS-DOS, OS/2 or MS windows
4d 5aMZ
Unix elf
7f 45 4c 46.ELF

有了上面的基础知识,我们就可以读文件前几个字节判断文件类型。

实现基础函数

首先定义文件魔数标识变量:

var(   pdf        = []byte{0x25, 0x50, 0x44, 0x46}RAR        = []byte{0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00}GZIP       = []byte{0x1F, 0x8B, 0x08}ZIP_0      = []byte{0x50, 0x4B, 0x03, 0x04}ZIP_1      = []byte{0x50, 0x4B, 0x05, 0x06}ZIP_2      = []byte{0x50, 0x4B, 0x07, 0x08}WEBP       = []byte{0x52, 0x49, 0x46, 0x46}   ...)

下面定义几个读文件函数。

首先是从ReadSeeker开始位置起读取几个字节函数:

func readUntil(l int, r io.ReadSeeker) ([]byte, error) {buff := make([]byte, l)_, err := r.Read(buff)if err != nil {return nil, err}r.Seek(0, io.SeekStart)return buff, nil}

基于魔数字节数组读文件魔数:

func checkBuffer(r io.ReadSeeker, t []byte) ([]byte, error) {   // 根据提供参数获取长度l := len(t)buff, err := readUntil(l, r)if err != nil {return make([]byte, 0), err}return buff, nil}

基于参数比较文件魔数:

func genericCompareBuffer(r io.ReadSeeker, t []byte) bool {buff, err := checkBuffer(r, t)if err != nil {return false}valid := bytes.Compare(t, buff)return valid == 0}

比较文件包括多个魔数情况比较:

func genericMultipleCompareBuffer(r io.ReadSeeker, t [][]byte) bool {buff, err := checkBuffer(r, t[0])if err != nil {return false}for _, v := range t {if bytes.Compare(v, buff) == 0 {return true}}return false}

类型判断函数

有了上面的基础函数,我们可以提供上层应用接口函数。

首先是常用类型判断函数,注意这里PNG、JPEG是前面定义的字节数组变量。

// IsPng function will return true if File is a valid PNGfunc IsPng(r io.ReadSeeker) bool {return genericCompareBuffer(r, PNG)}// IsJpeg function will return true if File is a valid JPEGfunc IsJpeg(r io.ReadSeeker) bool {return genericCompareBuffer(r, JPEG)}// IsPdf function will return true if File is a valid PDFfunc IsPdf(r io.ReadSeeker) bool {return genericCompareBuffer(r, PDF)}// IsGif function will return true if File is a valid GIFfunc IsGif(r io.ReadSeeker) bool {return genericCompareBuffer(r, GIF)}

同类文件可能有不同魔数场景:

// IsMpg function will return true if File is a valid MPGfunc IsMpg(r io.ReadSeeker) bool {return genericMultipleCompareBuffer(r, [][]byte{MPG_0,MPG_1,})}

最后提供一个同时判断多种文件类型的函数,利用函数类型参数:

// IsOneOf function will validate File with multiple functionfunc IsOneOf(r io.ReadSeeker, functions ...function) bool {for _, f := range functions {valid := f(r)if valid {return true}}return false}

测试代码

下面测试前面定义的函数,函数包括文件名称参数,判断该文件类型:

package mainimport ("fmt""os")func main() {args := os.Argsif len(args) < 2 {fmt.Println("required input file")os.Exit(1)}   // 打开文件inputFileArg := args[1]inFile, err := os.Open(inputFileArg)if err != nil {fmt.Println("error open input file ", err)os.Exit(1)}   // 支持错误处理的关闭方式defer func() {       err := inFile.Close()       if err != nil {         fmt.Println("error close input file ", err)      }   }()   // 一次性判断多种类型,如:是否为图像文件valid := IsOneOf(inFile, filesig.Is3gp, filesig.IsPng, filesig.IsJpeg)fmt.Println(valid)   // 当然也可以判断单个类型   valid = filesig.Is3gp(inFile)fmt.Println(valid)}

Golang基于文件魔数如何判断文件类型”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: Golang基于文件魔数如何判断文件类型

本文链接: https://www.lsjlt.com/news/349306.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Golang基于文件魔数如何判断文件类型
    本篇内容介绍了“Golang基于文件魔数如何判断文件类型”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!查找位置File.Seek()函数可以...
    99+
    2023-07-05
  • Golang基于文件魔数判断文件类型的案例代码
    目录查找位置文件类型实现基础函数类型判断函数测试代码总结本文介绍基于魔数判断文件类型,涉及文件查找读取内容、文件魔数、字节比较,最后还介绍函数参数的知识。 查找位置 File.See...
    99+
    2023-02-17
    go文件类型 go文件魔数判断文件类型
  • python怎么判断文件类型
    在python中使用filetype库判断文件类型:1.新建python项目;2.导入filetype库;3.使用filetype.guess()方法存储文件路径;4.通过if语句判断文件类型;具体步骤如下:首先,打开python,并新建一...
    99+
    2024-04-02
  • Linux中怎么判断文件系统类型
    Linux中怎么判断文件系统类型,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、 使用 df 命令df 命令报告文件系统磁盘空间利用率,要显示特定的磁盘分区的文件系统类型,像...
    99+
    2023-06-16
  • 文件的真实类型如何利用java进行判断
    文件的真实类型如何利用java进行判断?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。具体代码如下:package com.zhuifeng.util.excel...
    99+
    2023-05-31
    java ava
  • ASP.net中怎么判断上传文件的类型
    本篇文章给大家分享的是有关ASP.net中怎么判断上传文件的类型,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、 安全性比较低,把文本文件1.txt改成1.jpg照样可以上传...
    99+
    2023-06-17
  • java判断文件类型的方法是什么
    Java可以通过以下方法来判断文件的类型:1. 使用java.nio.file.Files类的probeContentType()方...
    99+
    2023-10-09
    java
  • node中如何判断是文件还是文件夹
    这篇文章主要介绍node中如何判断是文件还是文件夹,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 在node中,可以利用isFile()和isDirect...
    99+
    2024-04-02
  • shell如何判断文件非空
    这篇文章主要介绍了shell如何判断文件非空,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。判断文件非空if [[ -s&...
    99+
    2024-04-02
  • C#如何判断文件或文件夹是否存在
    小编给大家分享一下C#如何判断文件或文件夹是否存在,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!判断文件或文件夹是否存在使用Sy...
    99+
    2024-04-02
  • bash如何判断文件或文件夹是否存在
    这篇文章将为大家详细讲解有关bash如何判断文件或文件夹是否存在,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。代码#shell判断文件夹是否存在#如果文件夹不存在,创建文件夹if [ ...
    99+
    2023-06-09
  • Python如何判断文件和文件夹是否存在
    本篇内容主要讲解“Python如何判断文件和文件夹是否存在”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python如何判断文件和文件夹是否存在”吧!一、python判断文件和文件夹是否存在、创...
    99+
    2023-07-04
  • python如何判断文件或文件夹是否存在
    这篇文章给大家分享的是有关python如何判断文件或文件夹是否存在的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Python 操作文件时,我们一般要先判断指定的文件或目录是否存在,不然容易产生异常。1.文件#&n...
    99+
    2023-06-29
  • 基于SpringBoot框架如何管理Excel和PDF文件类型
    这篇文章主要介绍基于SpringBoot框架如何管理Excel和PDF文件类型,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、文档类型简介1、Excel文档Excel一款电子表格软件。直观的界面、出色的计算功能和图...
    99+
    2023-06-02
  • golang怎么判断文件是否存在
    在Golang中,可以使用os.Stat()函数来判断文件是否存在。 首先,导入os包: import "os" 然后,使用os.S...
    99+
    2023-10-23
    golang
  • php如何判断是不是文件
    本篇内容主要讲解“php如何判断是不是文件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php如何判断是不是文件”吧!在php中,可以利用is_file()来判断是不是文件,该函数的作用就是检查...
    99+
    2023-06-25
  • python如何判断函数类型
    在python中使用isinstance函数判断函数的类型,具体方法如下:class Person(object):def __init__(self, name, gender):self.name = nameself.gender =...
    99+
    2024-04-02
  • JavaScript如何判断数据类型
    这篇文章给大家分享的是有关JavaScript如何判断数据类型的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。判断数据类型使用 Object.prototype.toString 配合闭包,在保证判断数据类型的准确...
    99+
    2023-06-27
  • python如何判断文件存在方式
    目录前言一.检查文件夹/文件是否存在1. os.path.exists()2. os.path.isfile()和os.path.isdir()3. os.access()4. 异常...
    99+
    2024-04-02
  • JavaScript如何判断文件是否存在
    小编给大家分享一下JavaScript如何判断文件是否存在,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!JavaScript有什么特点1、js属于一种解释性脚本语言;2、在绝大多数浏览器的支持下,js可以在多种平台下运行,...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作