🗒️文件魔术数字(文件签名)

type
status
date
slug
summary
tags
category
icon
password
URL

文件签名和魔术数字

文件签名,也称为魔术数字,是文件头部的特定字节序列,用于标识文件类型。它通常位于文件的开始位置,由几个字节组成。
作用
文件签名可以用于以下目的:
  • 识别文件类型:通过读取文件签名,可以确定文件的类型,例如文本文件、图像文件、音频文件或视频文件。
  • 验证文件完整性:如果文件的签名与预期签名不一致,则可能表明文件已损坏或被篡改。
  • 支持软件功能:某些软件应用程序会根据文件签名来决定如何处理文件。例如,文本编辑器会根据文件签名来确定文件的编码方式。
另外,对于.txt,.js,.html等这些文本文件,文本文件与二进制文件(非文本文件)的区别仅仅是编码上不同,文本文件的编码通常为UTF-8。UTF-88-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码。它可以用一至四个字节对Unicode字符集中的所有有效编码点进行编码。
 
计算机系统中的文件都是由0和1组成的,因为计算机只能识别和处理二进制数据。位和字节是两种用来表示和存储二进制数据的单位。
位是二进制数据的基本单位,它可以表示两种状态:0或1。位通常用来表示开关、逻辑值或其他二进制数据。
字节
字节是计算机中最常用的数据单位,它由8个位组成。一个字节可以表示256种不同的状态,通常用来表示文本、数字、图像和其他数据。
 
一个字节可以写成2个十六进制数字的组合,魔术数字通常使用十六进制数字表示,因为十六进制数字可以更方便地表示二进制数据。例如,魔术数字0x7F 0x45 0x4C 0x46在二进制形式下表示为:
01111111 01000101 01001100 01000110
使用十六进制数字表示魔术数字可以使代码更加易读和易于维护。
 

typescript

export async function getMagicNumber(file: Blob, start = 0, end = 4) { const part = file.slice(start, end) const buffer = new Uint8Array(await part.arrayBuffer()) let hex = '' for (const v of buffer) { const str = v.toString(2).padStart(8, '0') const h1 = parseInt(str.slice(0, 4), 2).toString(16) const h2 = parseInt(str.slice(4), 2).toString(16) hex += h1 + h2 + ' ' } hex = hex.trim().toUpperCase() return hex } export async function isPNG(file: Blob) { return await getMagicNumber(file, 0, 8) === '89 50 4E 47 0D 0A 1A 0A'; } export async function isWEBP(file: Blob) { return await getMagicNumber(file, 0, 4) === '52 49 46 46' && await getMagicNumber(file, 8, 12) === '57 45 42 50' }
TypeScript

© black-black-cat 2021-2025