Base64编码与打印标签(label)实例

news2025/1/11 5:42:22

文章目录

  • 前言
  • 一、Base64 的简单认识
  • 二、Base64的使用场景
  • 三、 Base64的解码注意问题
      • 举个最近与后端配合的例子
  • 四、 base64 转换为arrayBuffer,blod
  • 总结


前言

文件格式转换,在日常编程尤为常见,例如pdf文件大小的压缩存储,前端用 标签显示图片。那这么有用的编码格式,下面就让我来认识下base64相关知识,以及实际开发接触的代码示例.


一、Base64 的简单认识

Base64是一种编码格式,用于将二进制数据转换为文本字符,使其可以在文本协议中传输。它的规则如下:

  1. 将原始二进制数据分割成每3个字节一组,每个字节占8位,总共24位。
  2. 将每组数据转换成4个6位的数字,即24位数据被转换成4个6位数。如果原始数据不足3个字节,则在末尾添加0补齐。
  3. 将这4个6位数字转换成对应的Base64字符,如A-Z、a-z、0-9、+、/,共64个字符。
  4. 如果数据长度不是3的倍数,补充1或2个“=”字符作为填充,使得数据长度成为4的倍数。
  5. 将所有的字符连接起来,形成Base64编码字符串。

例如,原始二进制数据为01010100 01100101 01110011 01110100 00100000 01101101 01100101,将其转换为Base64编码后为:VGVzdCBtZQ==。其中“=”字符是填充字符。

二、Base64的使用场景

base64的常见实际使用场景:

  1. 数据传输:在网络传输中,常常需要将二进制数据转换为文本格式进行传输,因为文本格式对于不同平台和设备具有更好的兼容性。base64编码就是一种将二进制数据转换为文本格式的编码方式,因此在数据传输过程中经常使用base64编码。

  2. 加密解密:有些加密算法只能加密文本格式的数据,因此需要将二进制数据转换为文本格式进行加密。而base64编码可以将二进制数据转换为文本格式,所以在某些加密算法中也会使用base64编码。

  3. 图片、音频、视频处理:在一些场景中,需要对图片、音频、视频等二进制数据进行处理,比如上传到网站、发送到社交网络等。由于这些数据不是文本格式,不能直接传输,因此需要将其转换为文本格式。 这时,就可以使用base64编码来将这些数据转换为文本格式进行传输。

  4. 数据存储:在一些数据库和存储系统中,需要将二进制数据存储为文本格式。由于base64编码可以将二进制数据转换为文本格式,因此在一些数据存储系统中也会使用base64编码。

三、 Base64的解码注意问题

  1. 输入数据必须是经过Base64编码的数据。
  2. 解码后的数据格式可能是二进制格式,而不是文本格式,需要根据实际情况进行转换。
  3. 当解码的数据出现错误时,会抛出异常,需要进行异常处理。
  4. 由于Base64编码中使用了特殊字符,如"+“、”/“和”=", 可能会与一些编程语言的特殊字符产生冲突,所以在解码时需要注意这些字符可能会被转义或丢失。
  5. 在某些情况下,Base64解码可能会引起安全隐患,因此在解码前需要确保数据来源可靠。

举个最近与后端配合的例子

后端返回的一串base64的文本,让我在前端显示图片。当然我用的就是常规操作。 , 但是没有正常显示图片出来。这里就要分base64 转码前是不是图片数据。
经了解,说是pdf数据转码的🔐。那我们可以把base64解码得到pdf数据再转为blod,blod在转为base64,前端拿到图片类型base64 那就好办了。
这里我们在 http://labelary.com/viewer.html ,取zpl 代码(zpl ,与打印机通信的代码),

      let zplCode = `^XA

^FX Top section with logo, name and address.
^CF0,60
^FO50,50^GB100,100,100^FS
^FO75,75^FR^GB100,100,100^FS
^FO93,93^GB40,40,40^FS
^FO220,50^hello bae64^FS
^XZ`
      const formdata = new FormData()
      //可以通过append()方法来追加数据
      formdata.append('file', zplCode)
      // labelary提供的api,返回pdf
      fetch('http://api.labelary.com/v1/printers/8dpmm/labels/4x6/0/', {
        method: 'post',
        body: formdata,
        header: {
          Accept: 'application/pdf',
          'Content-Type': 'application/x-www-form-urlencoded'
        }
      })
        .then(function (data) {
          if (data?.status == 404) {
            return null
          }
          console.log('data', data)
          return data.blob()
        })
        .then(function (blod) {
          if (!blod) {
            return ElMessage.warning('Zpl code is incorrect.')
          }
          console.log(blod)
          var reader = new FileReader()
          reader.onload = function (e) {
            // console.log(e.target?.result) 返回base64 格式
            callBackFn(row, e.target?.result)
            resolve(true)
          }
          reader.readAsDataURL(blod)
        })

上面的例子经过测试是可行的,拿到图片格式的base64格式后,我用菜鸟打印插件模板语言显示就行,可以正常打印出label(标签),但是用后端给的base64 解码后出现中文乱码.

我是这样解码的:用js自带的解码方式,咋一看也没有什么问题

window.atob('base64数据')

后来经二次沟通,原来后端给的base64是经过gzip 压缩过的(说是为了传输效率),导致我 window.atob(‘base64数据’) 得到不是原来的数据。😓,这个需要给后端处理后。我用上面的思路应该就可以。

四、 base64 转换为arrayBuffer,blod

// Base64 字符串
const base64String = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAACBjSFJN" +
  "AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAJklEQVRIx2NgGJKA" +
  "wAMAAFJgGseYwYAAAAASUVORK5CYII=";

// 将 Base64 转换为 ArrayBuffer
const arrayBuffer = Uint8Array.from(atob(base64String.split(",")[1]), (c) => c.charCodeAt(0)).buffer;

// 将 ArrayBuffer 转换为 Blob 对象
const blob = new Blob([arrayBuffer], { type: "image/png" });
 

上述代码中,通过 atob 函数将 Base64 字符串解码成二进制字符串,再通过 Uint8Array 将二进制字符串转换为 ArrayBuffer 对象。然后,再将 ArrayBuffer 对象转换为 Blob 对象,指定 MIME 类型为 “image/png”。如果需要转换为其他类型的文件,只需要修改 MIME 类型即可。

注意:在使用 atob 函数解码 Base64 字符串时,需要将 “data:image/png;base64,” 这部分前缀去掉,只保留 Base64 编码部分。


总结

在本篇文章,我们认识什么是Base64编码格式,以及它内部的编码规则;也列举了base64的常用使用场景以及注意方面,同时也列举了实际场景使用与代码示例。最后列举几种常用base64转码为arrayBuffer,blod等格式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1037601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Arduino驱动MMA7260三轴加速度传感器(惯性测量传感器篇)

目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 Arduino驱动MMA7260三轴加速度传感器芯片,可以应用到摩托车和汽车放倒报警、遥控航模、游戏手柄、人形机器人跌倒检测、硬盘冲击保护、倾斜度测量等场合。 1

Java初级到中级:技术提升的策略与方法

文章目录 1 问题背景2 前言3 方法 1 问题背景 截至2023年7月,笔者已经毕业2年了,每天都在搬砖打螺丝,自我感觉需要沉淀、思考、总结一下。思考和总结一下如何从Java初级提升到Java中级,需要掌握一些什么方法论,有效地去…

使用命令行快速创建Vite项目

一、构建项目 在终端中使用如下命令行: npm create vite 二、定义项目名称 三、选择项目类型 Vanilla是我们常用的JavaScript,Vue和React是常用前端框架,可以根据自己的需要进行选择 通过上下键进行选择,按下回车进行确认 创建…

CMU15-445 format\clang-format\clang-tidy 失败

CMU15-445 format\clang-format\clang-tidy 失败 问题修改 问题 -- Setting build type to Debug as none was specified. -- Youre using Clang 14.0.0 CMake Warning at CMakeLists.txt:67 (message):BusTub/main couldnt find clang-format.CMake Warning at CMakeLists.tx…

VS2019创建GIt仓库时剔除文件或目录

假设本地有解决方案“SomeSolution” 1、首先”团队资源管理器“-“创建Git存储库”,选择“仅限本地”、“创建” VS会在解决方案目录下自动生成.gitattributes、.gitignore 2、编辑gitignore,直接拖到VS里或者用记事本打开。添加要剔除的文件或文件夹…

git --- 回滚 restore, reset, revert

git --- 回滚 restore, reset, revert git revertgit restoregit resetgit reset --softgit reset --mixedgit reset -- hard git revert git revert 是用于“反做”某一个版本,以达到撤销该版本的修改的目的也就是git revert会生成一个新的commit, 而这个commit需要…

Spring Cloud Alibaba快速整合OpenFeign

文章目录 spring cloud alibaba 整合OpenFeign整合流程1.导入依赖2. 编写调用接口2.1 service(这里写的是clients)2.2 controller 3.设置其最大链接时间3.1 配置文件3.2 client3.3 接口3.4 被访问的controller spring cloud alibaba 整合OpenFeign Fore…

C++之lseek64应用总结(二百三十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

基于STM32的宠物托运智能控制系统的设计(第十七届研电赛)

一、功能介绍 使用STM32作为主控设备,通过DHT11温湿度传感器、多合一空气质量检测传感器以及压力传感器对宠物的托运环境中的温湿度、二氧化碳浓度和食物与水的重量进行采集,将采集到的信息在本地LCD显示屏上显示,同时,使用4G模块…

IO模型学习

一、IO读写的基本原理 一个原则:操作系统将内存划分为两部分:一个是内核空间,一个是用户空间。在linux操作系统中,内核模块运行在内核空间,相应的进程处在内核态;用户程序运行在用户态,对应的进…

Vis.js教程(一):基础教程

1、Vis.js是什么 一个动态的、基于浏览器的可视化库。 该库的设计易于使用,能够处理大量动态数据,并能够对数据进行操作和交互。 该库由 DataSet、Timeline、Network、Graph2d 和 Graph3d 组件组成。 Vis.js官网:https://visjs.org/ github…

MS COCO数据集介绍以及pycocotools使用

MS COCO数据集介绍以及pycocotools使用 1、MS COCO数据集简介2、MS COCO数据集目录结构3、 MS COCO标注文件格式3.1 使用Python的json库查看3.2 使用官方cocoAPI查看 4、目标检测验证任务mAP 1、MS COCO数据集简介 2、MS COCO数据集目录结构 ├── coco2017: 数据集根目录├─…

Elasticsearch(Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合)

Elasticsearch(三)——Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合 一、Es搜索 这里的 Es 数据博主自己上网找的,为了练习 Es 搜索。 1、Elasticsearch 搜索入门 …

<十二>objectARX开发:Arx注册命令类型的含义以及颜色索引对应RGB值

1、注册命令类型 我们经常在acrxEntryPoint.cpp中看到注册命令如下: 那么各个宏定义代表什么意思呢? 主标识:(常用的) ACRX_CMD_MODAL: 在别的命令执行的时候该命令不会在其中执行。ACRX_CMD_TRANSPARENT: 命令可以再其它命令中执行,但在该标志下ads_sssetfirst()不能使…

Python实现猎人猎物优化算法(HPO)优化LightGBM回归模型(LGBMRegressor算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…

MySQL学习笔记13

DISTINCT数据去重: 案例:获取tb_student学生表学员年龄的分布情况。 mysql> select * from tb_student; ------------------------------------------------- | id | name | age | gender | address | --------------------------…

Go内置函数make和new的区别?

首先纠正一下make 和 new 是内置函数,不是关键字。 变量初始化,一般分为2步,变量声明变量内存分配,var 关键字就是用来声明变量的,new和make 函数主要是用来分配内存的。 var 声明值类型的变量时,系统会默…

[数据结构】栈和队列

目录 1.栈 1.1概念 1.2 栈的使用 1.3.栈的模拟实现 2.队列 2.1概念 2.2队列的使用 2.3队列的模拟实现 2.4 循环队列 2.5双端队列 1.栈 1.1概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一…

PPT系统化学习 - 第1天

文章目录 更改PPT主题更改最大撤回次数自动保存禁止PPT压缩图片字体嵌入PPTPPT导出为PDFPPT导出为图片PPT导出为图片型幻灯片PPT导出成视频添加参考线设置默认字体设置默认形状建立模板、保存模板、使用模板建立模板保存模板使用模板 更改PPT主题 更改PPT的主题: 夜…

如何进行销售漏斗管理?

本文将为大家讲解:如何进行销售漏斗管理? 销售漏斗管理是现代销售管理的核心概念之一。它将销售过程分解为一系列阶段,从而帮助销售团队更有效地跟踪和管理潜在客户。本文将深入探讨销售漏斗管理的方法,并结合简道云CRM的实际应用…