当前位置: 首页 > news >正文

检测无后缀名的文件类型

前言

一般情况下我们判断一个文件是什么类型都是通过看它的后缀名,例如 xx.mp3 xx.mp4 xx.jpg,但是这并不准确!
假如我把 xx.wav 文件的后缀手动改成了 .mp3 ,但它的文件类型依旧是 wav,因为计算机是通过读取文件二进制的前几个字节来区分文件类型,
对于大多数类型的文件,起始字节都是固定的,这些字节通常被称为 “魔数” (Magic Number)

常见文件的“魔数”

  1. JPEG 图片:FF D8 FF DB | 49 46 00 01
  2. PNG 图片:89 50 4E 47 0D 0A 1A 0A
  3. MP3 音频:49 44 33 | FF FB | FF F3 | FF F2
  4. MP4 视频:66 74 79 70 69 73 6F 6D

更多请参考 维基百科 - List of file signatures

读取文件二进制数据

const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = (e) => {
  // 这里就拿到了文件的二进制数据
  const arrBuffer = e.target.result as ArrayBuffer;
};
reader.onerror = (err) => {
  throw new Error(err);
};

二进制数组 转 16 进制字符串

这里有个需要注意的地方,如果文件太大了,导致二进制数组长度超过 2^32,
使用 Array.form 方法转换时候会报错 invalid array length
详情可参考:MDN - invalid array length

function bufferToString(buffer: ArrayBuffer) {
  const uint8Array = new Uint8Array(buffer, 0, Math.pow(2, 16));
  return Array.from(uint8Array)
    .map((byte) => byte.toString(16).padStart(2, "0"))
    .join("");
}

类型判断

最后通过正则去匹配字符串开头是否包含对于文件的“魔数”。

const Mp3MagicNum = ["494433", "FFE2", "FFE3", "FFF2", "FFF3", "FFFA", "FFFB"];

function isMp3Type(hex: string) {
  for (let key of this.Mp3MagicNum) {
    if (new RegExp("^" + key, "i").test(hex)) return true;
  }
  return false;
}

const hex = bufferToString(arrBuffer);
const isMp3 = isMp3Type(hex);
http://www.dtcms.com/a/102673.html

相关文章:

  • 《筋斗云的K8s容器化迁移》
  • Linux孤儿进程和僵尸进程
  • 谈谈常见的数据结构(如数组、链表、栈、队列、哈希表、树、图)及其应用场景
  • OpenHarmony v4.1 Release设置应用随系统自动启动
  • Sa-Token核心功能解剖三(OAuth2.0认证、分布式会话、参数签名 )
  • Transformers without Normalization paper笔记
  • Android OpenGLES 360全景图片渲染(球体内部)
  • wsl2的centos7安装jdk17、maven
  • 欧拉公式和sin cos
  • 3.31Python有关文件操作
  • 【java】Java核心知识点与相应面试技巧(九)——异常
  • PHP回调后门
  • Ubuntu22.04系统离线部署Maxkb【教程】
  • 再见VS Code!Google IDE 正颠覆传统开发体验
  • 探秘中医五色五味:开启饮食养生新智慧
  • Element ui input组件类型为 textarea 时没有 清空按钮
  • [网络_1] 因特网 | 三种交换 | 拥塞 | 差错 | 流量控制
  • Nordic 新一代无线 SoC nRF54L系列介绍
  • Tiny Lexer 一个极简的C语言词法分析器
  • 回溯(子集型):分割回文串
  • 如何在 Windows 上安装与配置 Tomcat
  • 基于PX4和Ardupilot固件下自定义MAVLink消息测试(QGroundControl和Mission Planner)
  • 76. pinctrl和gpio子系统试验
  • 【Easylive】HikariCP 介绍
  • 14:00开始面试,14:08就出来了,问的问题有点变态。。。
  • YOLO霸主地位不保?开源 SOTA 目标检测rf-detr 测评
  • UR机械臂sim2real推荐包
  • CUDA专题8—CUDA L2缓存完全指南:从持久化策略到性能优化实战
  • 代码随想录Day29
  • 学以致用,基于OpenCV的公摊面积估算程序