百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

详述图片base64加密的原理,告诉你什么是"/9j/"

liuian 2025-03-14 18:46 16 浏览

在日常的生活中,我们肯定都经历过类似这样的场景:报名考试上传图片,网站要求的是上传的照片不能大于多少,而且要求是“.jpg”的格式。

于是你高高兴兴地把自己最漂亮的照片上传上去了,但是网站却提示你照片格式不正确,让你重新上传。这个时候内心不知道有多少疑惑涌上心头(其实是奔腾)我的照片明明就是“.jpg”结尾的,而且大小也符合规范,为啥就不行呢?

我们通常的会认为(Windows电脑情况下,Mac不知道,毕竟我没有图片)“.jpg”图片结尾的就一定是符合规范的“JPG”文件类型。其实一开始我也是这样认为的,直到前几天,我在对接项目的时候踩了一个大坑,很大的坑!

我对接的项目要求的是图片是“JPG”类型的文件,并且经过base64进行编码之后要以"/9j"开头的文件。于是我就把我电脑上保存的看似符合规范的图片上传上去了,结果就是一堆报错信息。于是我再次尝试,换一些其他的图片进行测试,发现有的就好使,有的就不好使。说实话,我的内心崩溃了!那种感觉你懂得图片

回到家之后我思来想去就是不知道为什么要求什么"/9j"开头的?我打开了百度,输入了关键词“/9j”之后,呵呵!我笑了,都是些什么?完全跟我的问题不着边!

什么玩意?这到底是什么玩意?竟然连强大的百度都没有给出结果!就这样,我搜索到了凌晨12点......

扛不住了,我就去睡觉了。但是躺在床上我辗转难眠,打开手机继续各种搜索着......突然!我看了一个关于电脑图片文件头信息解析的文章!一道灵光从我脑门上闪过。于是我起床,默默打开了电脑,打开了百度......

原来电脑在存储的时候是存储了图片的基本信息的,比如图片是什么类型的,图片的宽高等基本信息,这些个基本信息叫做图片头信息。好吧!原谅我的无知,曾经的我天真的以为是按照文件后缀名区分的呢。

我们应知道,图片在计算机中存储是一个一个的像素点,最底层也是二进制文件,所以需要文件头来保存文件信息。经查找资料,我找到如下对图片不同格式的文件头标识信息(16进制标识):

1.BMP 文件头标识 (2 bytes) 42 4D 2.PNG 文件头标识 (8 bytes) 89 50 4E 47 0D 0A 1A 0A 3.GIF 文件头标识 (6 bytes) 47 49 46 38 39(37) 61 4.JPEG/JPG 文件头标识 (2 bytes): FF D8 (SOI) (JPEG 文件标识) 于是我在电脑上保存了一个为“.jpg”后缀结尾的图片,然后使用UE这个强大的工具打开,果然不出我所料,看看这个文件的内容信息。


不出意外的话,你肯定看不懂这些东西,因为这些是16进制文件。但是重要的我已经给你标注出来了,那就是“FF D8”。

在这里我给大家稍微简单科普下base64的编码规则:假如我们有个“hello”这样的关键字进行base64编码,需要先把“hello”转换成二进制,也就是"110100011001011101100110 11001101111"。我这里给了一个ASCII表,这里对应的是10进制的,需要把十进制转化成2进制的。



关于base64 有个规定就是,一个字符转换之后如果位数不为8位,需要在高位补0,然后再6位截取,最后不够6位的,低位补0。然后把分割后的2进制转换成10进制并对照base64编码表进行解析。那么上述的“hello”的解析过程就如下:


所以“hello”base64编码之后的最终结果就是“aGVsbG8=”。也许你会疑惑,为什么多了个“=” 这个其实是base64的规定,编码完毕之后自动添加一个或两个“=”。

那么再回到“FF D8”,jpg文件的标识头,他经过base64转码之后是什么呢?


谢天谢地,可算搞明白为什么是“/9j”开头的了。其实还有另外一种方式快速查看是不是jpg格式文件。我们可以使用记事本的方式打开一个jpg文件。


打开之后,你肯定还是看不懂这些东西,但是重要的我已经给你标注出来了,那就是“JFIF”,这个是一个很重要的标识,所谓的“JFIF”就是"JPEG File Interchonge Format"即JPEG文件交换格式。

为了还原我之前明明是“.jpg”后缀的文件,但是识别失败的问题。我们把一个格式为“.png”图片,通过改后缀名的方式,改成“.jpg”。然后也用记事本打开查看文件的内容。


可以看到,并不是“JFIF”,因此这并不是一个jpg文件,所以上传无法识别。

带着问题去睡觉,果然是睡不着的!通过这次的经历,我知道了base64的编码原理,明白了文件在电脑中存储并不是靠简简单单的后缀名来区分的,而是有文件头信息的。文件到底是一个什么文件,还是要靠文件头信息来决定的。所以,你以后的程序判断文件类型千万不要仅仅判断后缀名就完事了哦!


作者:小猴子的技术笔记
链接:
https://juejin.cn/post/6916294725691506696

来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关推荐

使用Assembly打包和部署Spring Boot工程

SpringBoot项目的2种部署方式目前来说,SpringBoot项目有如下2种常见的部署方式一种是使用docker容器去部署。将SpringBoot的应用构建成一个docke...

java高级用法之:调用本地方法的利器JNA

简介JAVA是可以调用本地方法的,官方提供的调用方式叫做JNI,全称叫做javanativeinterface。要想使用JNI,我们需要在JAVA代码中定义native方法,然后通过javah命令...

Linux中如何通过Shell脚本来控制Spring Boot的Jar包启停服务?

SpringBoot项目在为开发者带来方便的同时,也带来了一个新的问题就是Jar包如何启动?在一般情况下我们都是采用了最为经典的java-jar命令来进行启动。然后通过ps命令找到对应的应用线程通...

牛逼!自己手写一个热加载(人民币手写符号一个横还是两个横)

热加载:在不停止程序运行的情况下,对类(对象)的动态替换JavaClassLoader简述Java中的类从被加载到内存中到卸载出内存为止,一共经历了七个阶段:加载、验证、准备、解析、初始化、使用、...

java 错误: 找不到或无法加载主类?看看怎么解决吧!

问题扫述:项目名称调整,由原来的com.mp.qms.report.biz调整为com.mp.busicen.mec.qms.report.biz后。项目在IDEA直接运行,但打包部署到服务器...

如何将 Spring Boot 工程打包成独立的可执行 JAR 包

导语:通过将SpringBoot项目打包成独立的可执行JAR包,可以方便地在任何支持Java环境的机器上运行项目。本文将详细介绍如何通过Maven构建插件将SpringBoot...

class 增量发包改造为 jar 包方式发布

大纲class增量发包介绍项目目录结构介绍jar包方式发布落地方案class增量发包介绍当前项目的迭代修复都是通过class增量包来发版本的将改动的代码class增量打包,如下图cla...

Jar启动和IDE里启动Sprintboot的区别

想聊明白这个问题,需要补充一些前提条件,比如Fatjar、类加载机制等1、Fatjar我们在开发业务程序的时候,经常需要引用第三方的jar包,最终程序开发完成之后,通过打包程序,会把自己的代码和三...

Java 20年,以后将往哪儿走?(java还能流行多久)

在今年的Java20周年的庆祝大会中,JavaOne2015的中心议题是“Java的20年”。甲骨文公司Java平台软件开发部的副总裁GeorgesSaab的主题演讲就将关注点放在了java...

Spring Boot Jar 包秒变 Docker 镜像实现多环境部署

你是否在互联网大厂后端开发工作中,遇到过这样的困扰?当完成一个SpringBoot项目开发,准备将Jar包部署到不同环境时,却发现各个环境依赖不同、配置复杂,部署过程繁琐又容易出错,不仅耗费...

从0开始,让你的Spring Boot项目跑在Linux服务器

1搭建Linux服务器1.1购买阿里云服务器或安装虚拟机这里建议是CentOS7.X或CentOS8.X,当然其他的Linux如deepin、Ubuntu也可以,只是软件环境的安装包和安装方式...

【技术】Maven 上传第三方jar包到私服

通过nexus后台上传私服以NexusRepositoryManagerOSS2.14.5-02为例。登录nexus后台。定义Maven坐标Maven坐标有两种方式:1.自定义参数;2....

JVM参数、main方法的args参数使用

一、前言我们知道JVM参数分为自定义参数、JVM系统参数,Javamain方法的参数。今天就谈谈怎么使用吧。二、查看jvm参数定义自定义参数我们打开cmd窗口,输入java,就能看到自定义参数的格式...

Maven项目如何发布jar包到Nexus私服

Maven项目发布jar包到Nexus私服在编码过程中,有些通用的代码模块,有时候我们不想通过复制粘贴来粗暴地复用。因为这样不仅体现不了变化,也不利于统一管理。这里我们使用mavendeploy的方...

干货丨Hadoop安装步骤!详解各目录内容及作用

Hadoop是Apache基金会面向全球开源的产品之一,任何用户都可以从ApacheHadoop官网下载使用。今天,播妞将以编写时较为稳定的Hadoop2.7.4版本为例,详细讲解Hadoop的安...