Base64字节编码由两个系统之间的接口的说起

2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析 题目没有任何提示,附件gzl.pcap解题哥斯拉流量300多KB包很多,没啥经验只能挨个看回来之后又狠狠得撸了一把哥斯拉流量分析我这里用的是哥斯拉4.0.1测试链接这里发了两个包,我们进行分析。 阅读详情

起因

两个系统之间商量一个接口传输测量文件(有可能是Excel也有可能是Txt)
方案:对方系统往我们这个URL,采用HTTP协议,Post方法,传文件二进制数据

四种POST方式

表单编码类型
1、application/x-www-form-urlencoded
HTTP的消息体以查询字符串的方式发送(名/值对,用&分割,名字和值用=连接).其中非字母数字的字符用’%HH’替换。(HH是十六进制)
Ajax默认值: “application/x-www-form-urlencoded”。发送信息至服务器时内容编码类型。
2、multipart/form-data
每一部份用分开的MIME消息(文件的类型)表示。
并且,每一部份被特定的字符边界分开(boundary=---------------------------735323031399963166993862150).这个字符边界精心挑选一遍不会和内容重复。
每一部份有自己的MIME头(content-type).通过这个值可以选择更有效率的方式存储值,以节省带宽。(base64或者raw binary)
3、text/plain
文本
4、application/json及其他MiME类型
application/json 这个 Content-Type 作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦

采用前两种

application/x-www-form-urlencoded
这是默认的编码类型,使用该类型时,会将表单数据中非字母数字的字符转换成转义字符,如"%HH",然后组合成这种形式key1=value&key2=value2的方式编码。使用Ajax提交数据时,也是使用这种方式。Content-Type默认值是[application/x-www-form-urlencoded;charset=utf-8]
multipart/form-data
使用表单上传文件时,必须让表单的enctype等于multipart/form-data。
Request Headers :

Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8
Connection:keep-alive
Content-Length:13125
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryaqWXpQYCfMbAHgPh
Cookie:shiro.sesssion=1a6d4f4d-ab5f-4a1b-a5cd-fc71cf9633cb
Host:192.168.199.223
Origin:http://192.168.199.223
Referer:http://192.168.199.223/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36

Request Payload:

------WebKitFormBoundaryaqWXpQYCfMbAHgPh
Content-Disposition: form-data; name="fileEnterprise"; filename="a.jpg"
Content-Type: image/jpeg

------WebKitFormBoundaryaqWXpQYCfMbAHgPh
Content-Disposition: form-data; name="enterpriseName"

有限责任公司
------WebKitFormBoundaryaqWXpQYCfMbAHgPh
Content-Disposition: form-data; name="unifiedSocialCreditCode"

91530700781667237G
------WebKitFormBoundaryaqWXpQYCfMbAHgPh--

注意:

  • 一般来说,method和enctype是两个不同的互不影响的属性,但在传文件时,method必须要指定为POST,否则文件只剩下filename了;
  • 当没有传文件时,enctype会改回默认的application/x-www-form-urlencoded。

我的做法

当思考第一种时,意味着需要将二进制数据存为字符形式的,再传输
没过多思考就将二进制数据编码成字符串,出现以下两种情况
文本 转 **二进制 ** 转 字符串 转 经UTF-8编码和转码 转 字符串 转 二进制 转 文本
情况一:文本文件以Unicode或ASCII传输没有问题
情况二:Excel文件传输出了问题
本质上需要 保存 8Bit字节再 传输,我的做法就是用Unicode、或ASCII方式,但发现转回来字节数组不一致
1、最好的做法是Base64
2、把二进制数据转成HEX,类似于A00AX…,一个8位二进制转成2个16进制
3、用 - 分隔,用int32的字符串形式保存

思考

为什么出错?
二进制数据转成文本,文本可能缺失,还有编码也会让二进制多一B
正确的做法就是原样保存好二进制数据就好

            Byte[] byts = File.ReadAllBytes("123.xlsx");//length = 8575
            string str = "";

            ////编码
            //for (int i = 0; i < byts.Length; i++) {
            //    str += byts[i].ToString();
            //    if (i < byts.Length - 1) str += "-";
            //}
            ////解码
            //string[] strSplit = str.Split('-');
            //Byte[] bytOrign = new byte[strSplit.Length];
            //for (int i = 0; i < strSplit.Length; i++) 
            //{
            //    bytOrign[i] = Convert.ToByte(strSplit[i]);
            //}

            str = HexToString(byts);
            Byte[] bytOrign = StringToHex(str);

            //Base64String编码,数据没有变化,保存字节时采用的时Base64编码
            //网络上常见的传输8Bit字节码的编码方式
            //string sx = Convert.ToBase64String(byts);
            //Byte[] bytOrign = Convert.FromBase64String(sx);

            //Unicode编码,当数据为奇数 b时,会导致最后一个字节编译成字符,再将字符转为字节时多出一个00
            //string str = System.Text.Encoding.Unicode.GetString(byts);//length = 4288
            //Byte[] bytOrign = System.Text.Encoding.Unicode.GetBytes(str);
            
            //采用ASCII编码,字节数组大小是一样的,但是个别字节不一样
            //string str = System.Text.Encoding.ASCII.GetString(byts);
            //Byte[] bytOrign = System.Text.Encoding.ASCII.GetBytes(str);

            //UTF-8编码,字节大小和字节数据不一样
            //string str = System.Text.Encoding.UTF8.GetString(byts);
            //Byte[] bytOrign = System.Text.Encoding.UTF8.GetBytes(str);

            //GB2312 字节大小和字节数据不一样
            //string str = Encoding.GetEncoding("GB2312").GetString(byts);
            //Byte[] bytOrign = Encoding.GetEncoding("GB2312").GetBytes(str);

            File.WriteAllBytes("456.xlsx", bytOrign);
            File.WriteAllText("456.txt", str);            Byte[] byts = File.ReadAllBytes("123.xlsx");//length = 8575
            string str = "";

            ////编码
            //for (int i = 0; i < byts.Length; i++) {
            //    str += byts[i].ToString();
            //    if (i < byts.Length - 1) str += "-";
            //}
            ////解码
            //string[] strSplit = str.Split('-');
            //Byte[] bytOrign = new byte[strSplit.Length];
            //for (int i = 0; i < strSplit.Length; i++) 
            //{
            //    bytOrign[i] = Convert.ToByte(strSplit[i]);
            //}

            str = HexToString(byts);
            Byte[] bytOrign = StringToHex(str);

            //Base64String编码,数据没有变化,保存字节时采用的时Base64编码
            //网络上常见的传输8Bit字节码的编码方式
            //string sx = Convert.ToBase64String(byts);
            //Byte[] bytOrign = Convert.FromBase64String(sx);

            //Unicode编码,当数据为奇数 b时,会导致最后一个字节编译成字符,再将字符转为字节时多出一个00
            //string str = System.Text.Encoding.Unicode.GetString(byts);//length = 4288
            //Byte[] bytOrign = System.Text.Encoding.Unicode.GetBytes(str);
            
            //采用ASCII编码,字节数组大小是一样的,但是个别字节不一样
            //string str = System.Text.Encoding.ASCII.GetString(byts);
            //Byte[] bytOrign = System.Text.Encoding.ASCII.GetBytes(str);

            //UTF-8编码,字节大小和字节数据不一样
            //string str = System.Text.Encoding.UTF8.GetString(byts);
            //Byte[] bytOrign = System.Text.Encoding.UTF8.GetBytes(str);

            //GB2312 字节大小和字节数据不一样
            //string str = Encoding.GetEncoding("GB2312").GetString(byts);
            //Byte[] bytOrign = Encoding.GetEncoding("GB2312").GetBytes(str);

            File.WriteAllBytes("456.xlsx", bytOrign);
            File.WriteAllText("456.txt", str);

二进制时编码类型enctype详解](https://www.cnblogs.com/moqiutao/p/7782270.html)
https://blog.youkuaiyun.com/wufaliang003/article/details/79573512

私家侦探如何追踪难以找到的人,掌握几个很少人知道的在线免费查询网站,搜索人名、电话号码以及地址的开源网站 私家侦探如何追踪难以找到的人,掌握几个很少人知道的在线免费查询网站,搜索人名、电话号码以及地址的开源网站。 阅读详情

相关推荐

帆软 finereport FCRA 考试 题库+答案,共收录561题,大部分有答案

帆软 finereport FCRA 考试 题库+答案,共收录561题,大部分有答案 入门基础 11.多选题 以下方式中属于FineReport中预览模式的有( ) 分页预览、填报预览、新填报预览、数据分析、移动端预览 16.判断题 FineReport报表工具必须购买激活码后才能使用。 错误,可以免费获取激活码。 29.单选题 FineReport是一款利用( )语言开发的报表工具。java 41.多选题 访问帮助文档的方式有哪些?设计器中社区菜单下-帮助文档;直接访问http://help.finere

qq_37485720的博客 2万+

java restful application/x-www-form-urlencoded 传递参数

使用restful请求application/x-www-form-urlencoded格式的内容,需要设置表头,参数用MultiValueMap 的格式来处理。

一路向前 1万+

Open5GS实战:从零搭建树莓派5G核心网并与商用终端联调

本文详细介绍了如何在树莓派5上从零开始搭建基于Open5GS的5G核心网,涵盖系统准备、依赖安装、源码编译、关键配置修改及服务启动全流程。通过整合SDR基站与商用终端进行端到端联调,为开发者和研究者提供了一个低成本、可实践的5G网络实验平台,助力物联网与边缘计算应用的本地化测试与验证。

weixin_29194255的博客 157

为什么图片传输要使用base64编码

一般使用HTTP协议,传输的是字符文本或二进制数据,这2种场景覆盖了几乎所有使用HTTP协议的场景。HTTP协议规定,使用Content-Type请求头来约定传输消息的类型,这决定了请求方如何组织数据(编码和格式)以及接收方如何解析数据。Content-Type常用的取值有如下几种: 1、application/x-www-form-urlencoded 这种方式发送的数据在url上拼接,以key1=val1&key2=val2 的方式进行编码,key和val都进行了 URL转码,这是一种表单提交方式,表单

诗人不写诗 6639

ESD 防护深度解析:模型、等级、系统设计与防护策略

本文系统阐述了静电放电(ESD)防护的核心技术体系。首先对比分析了HBM(人体模型)和CDM(充电设备模型)两种基础ESD模型的物理特性、测试标准及分级要求,指出相同电压下CDM的破坏性是HBM的15-20倍。其次详细解析了IEC61000-4-2系统级ESD标准,包括接触/空气放电测试方法及判定等级。重点提出了系统级防护的三层架构:空间隔离(≥10mm间距)、电气隔离(地平面分割)和TVS管选型(响应时间<1ns),并对比了MOV、SCR等防护器件特性。针对不同应用场景(消费电子、工业控制等)给出了差异化

bother3000的博客 1882

基于FPGA的工业相机项目大赏1——cmos线阵相机

●CMOS CL0402 作为图像传感芯片,曝光后产生一定格式的图像数据;●FPGA ZYNQ7020 作为主控芯片负责cmos驱动控制、图像像素的采集、cmos寄存器的配置、cameralink协议的实现、上位机串口通信的实现;●Cameralink端子实现图像数据的高速串行发送,将数据传送至采集卡PC端。系统工作流程如下: FPGA 上电加载配置程序,计算机通过异步串口向 FPGA 发送控制信息,FPGA对接收的控制信息进行分析判断。

weixin_41895751的博客 6398

ajax传数据和图片(base64格式)

讲了一下ajax的用法(原生js版),以及如何在前端获取图片,以base64的形式用ajax传给后台,和后台解析图片保存。 感觉自己写的还是挺通俗易懂的~

杜公子 1万+

汽车ECU诊断刷写和OTA升级中的验签和校验

汽车ECU诊断刷写和OTA升级中的验签和校验

天赐好车的博客 616

Java图片base64编码解码,接口使用

在很多要求上传图片的接口中需要上传图片,可能使用最多的方式就是将图片经过base64编码后以字符串的形式上传,此处介绍一下如何将图片进行base64编码以及解码 1、图片编码。首先要将图片以文件的形式解析为byte[]数组,然后进行编码,在编码时,需要使用BASE64Encoder,此时需要引用sun.misc.BASE64Encoder类 import sun.misc....

719

备赛电赛学习硬件篇(六):复位电路工作原理

上电复位的工作过程是在加电时,复位电路通过电 容加给RST端一个短暂的高电平信号,此高电平信号随着Vcc对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间。在图2的复位电路中,当Vcc掉电时,必然会使RST端电压迅速下降到0V以下,但是,由于内部电路的限制作用,这个负电压将不会对器件产生损害。在上电或复位过程中,控制CPU的复位状态:这段时间内让CPU保持复位状态,而不是一上电或刚复位完毕就工作,防止CPU发出错误的指令、执行错误操作,也可以提高电磁兼容性能。

m0_61022809的博客 6771

RoCEv2 (RDMA over Converged Ethernet) 技术详细介绍

本文深入解析RDMA over Converged Ethernet (RoCEv2)技术,该技术是AI时代算力网络的核心。文章从四个维度展开:首先阐述RDMA如何通过零拷贝和内核旁路解决传统网络的数据搬运瓶颈;接着拆解RoCEv2协议栈,对比其与InfiniBand和iWARP的特性差异;然后分析其在分布式AI训练、高性能存储等场景的关键价值;最后提供实战指南,强调无损网络配置、流量隔离和精细监控的重要性。RoCEv2虽能带来微秒级延迟和极低CPU开销,但需精心设计网络环境才能发挥最大效能。

技术引领业务创新 1388

Jmeter测试上传图片base64编码接口

最近遇到一个项目,接口中有需要上传图片的字段,它是以图片base64编码格式的形式传递的。(Base64目前主要用于HTML5、移动开发等不考虑IE6的场景中。)请求报文示例如下: 关于如何测试实现的问题: 1)如何对图片进行编码?2)为了实现接口自动化测试,如何能实现自动base64编码 解决方案: 方法1:利用图片在线转码base64编码网站进行编码。编码网站:http://tool.css...

weixin_34159110的博客 1723

SPI协议详解(图文并茂+超详细)

先说串口 因为之前写过一篇UART,通用串行异步通讯协议,UART的相关资料 因为UART没有时钟信号,无法控制何时发送数据,也无法保证双发按照完全相同的速度接收数据。因此,双方以不同的速度进行数据接收和发送,就会出现问题。 如果要解决这个问题,UART为每个字节添加额外的起始位和停止位,以帮助接收器在数据到达时进行同步; 双方还必须事先就传输速度达成共识(设置相同的波特率,例如每秒9600位)。 传输速率如果有微小差异不是问题,因为接收器会在每个字节的开头重新同步。相应的协议如下图所示; 如果您注意到

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 33万+

【密码学】Base64 编码 ( Base64 简介 | Base64 编码原理 | 最后编码组字节不足时补位 ‘=‘ 符号 | Base64 编码实现参考 )

一、Base64 简介、 二、Base64 编码原理、 三、最后编码组字节不足时补位 '=' 符号、 四、Base64 编码实现参考

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 8989

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

base64怎么编码

换算单位 1字=2字节;1字节=8位;1位=1比特;1字=16位=16比特; 字节=Byte          比特=bit bit是表示信息的最小单位,只有两种状态:0和1 base64 base64代码对应表 base64代码范围:A-Za-z0-9+/ 26个大写字母、26个小写字母、10个数字、两个符号 26+26+10+2=64; 其实是 65 个字符, = 是填充字符; 64 个字符需..

weixin_52103018的博客 1416

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

HEX编码、Base64编码

摘要 本文将讲述HEX 和Base64,编码的规则。 HEX编码 hex编码也称之为Base16 编码 就是把一个字节,用十六进制来表示, 表示的结果得是字符形式的。 说过程大家就会更加容易理解 比如说字符的 ‘a’,在计算机底层存储的是 0110 0001 ,对应的16进制就是61 ,它对应的字符 是'61' 也就是说 ‘a’ 经过HEX编码转化成了 '61' ,从计算存储二进制的角度是 从0110 0001经过HEX编码成了 0011 0110 0000 0001,占用的存储扩大了一倍。 其他任意

你好 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Hutool实现字节流与Base64编码转换教程

Hutool是Java生态中​​轻量级、全场景​​的工具类库,封装了大量实用方法,其中类提供了​​字节流与Base64字符串的高效转换​​功能,支持普通Base64、URL安全Base64、MIME类型Base64等多种模式。本教程通过Hutool工具实现了​​字节流与Base64编码的互相转换​​,并演示了​​带Base64头的编码方法​​(适用于图片、文件等场景)。​​基础转换​(字节流转Base64)、(Base64转字节流);​​字符集控制​​:通过指定字符集,避免乱码;​。

Rysxt_的博客 1960

图片转Base64编码 base64编码转图片

这两天给手机写了几个服务(接口形式),其他数据还好,图片实在没处理过,这里记录下使用base64编码遇到的坑。。。。 1、图片转base64编码: public static String getImageStr(String imgUrl) {//将图片文件转化为字节数组字符串,并对其进行Base64编码处理 String imgFile = imgUrl;// 待处理的

fanxiangru999的专栏 5007

浅谈Base64编码规则

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在了解Base64编码之前,先了解几个基本概念:位、字节。 位:"位(bit)"是计算机中最小的数据单位。每一位的状态只能是0或1; 字节:8个二进制位构成1个"字节(Byte)",字节是存储空间的基本计量单位。1个字节可以储存1个英文字母,2个字节可以存储1个汉字; Base64编码的作用 因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就不能通过邮件传送。这样就受到了很大的限制

jinglong512741的专栏 5153

讲字节数组转化为base64_如何实现base64编码

一、base64编码(https://zh.wikipedia.org/wiki/Base64)base64编码就像ASCII编码一样,是用来表示二进制数据的,区别是ASCII是一个字符占一个字节,而一个字节表示八位,(2^8=256)所以有从0-255总共256种变化。而base64编码是2^6=64,每6个bits可以用一个字符来表示,也即ASCII中的三个字符转换成base64后变为4个字符...

weixin_36265665的博客 2604

JAVA之MD5加密字节流再进行Base64编码

应用场景:待签名数据以UTF-8的格式转字节流,对字节流进行MD5算法得到的签名字节流,再经过Base64转换为字符串,即生成签名。 import java.security.MessageDigest; /** * 需要引入的共同jar包 * apache-commons-codec-1.4.jar */ import org.apache.commons.codec.binary....

netuser1937的博客 1793

Pdf与Base64编码之间的转换

在我们的工作有时候我们需要将图片或者pdf文件转换为Base64编码,然后从服务器端下载传输到本地,在这里我列举下两者之间的转换方法: Base64编码转换为pdf:/** * Description: 将base64编码内容转换为Pdf * @param base64编码内容,文件的存储路径(含文件名) * @Author fuyuwei * Creat

路漫漫,水迢迢 4万+

Base64编码

独立博客文章链接:http://zhuyanfeng.com/archives/119 这两天的工作需要以HTTP方式调用某厂商的彩信接口,其中彩信内容需要进行Base64编码,然后将其中的“+”号以“_”代替,将“=”以“%”代替。这是我第一次接触Base64编码,今天初步学习了一下,以完成工作为目标,并没有深入。以下内容整理自“百度百科”和“WiKiPedia”。 Base

筒子楼 1743

python中base64编码

base64编码原理、python使用、应用;将图片保存成字符串

orangerfun的博客 9147

BASE64编码规则

Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。  例如字符串“张3” : 11010101 11000101 00110011  转换后: 00110101 00011100 00010100 00110011  用十进制表示即为:53 34 20 51  这个并不是最终的结果,还需要根据Bas

wangbofei的专栏 5676

base64转化字节流 js_Byte[]和BASE64之间的转换

把byte[]中的元素当做无符号八位整数转换成只含有64个基本字符的字符串,这些基本字符是:l 大写的A-Zl 小写的a-zl 数字0-9l '+' 和 '/'l 空白字符(包括空白、tab,换行)l ‘=’,为填充字符,结尾处可以填充0-2个填充字符这64个字符构成BASE64的字符集。 Base64是将原文按照每 3 个字节一组分开,这个 3 字节组中的每一组将被按照位分解成 4 个部分,每...

weixin_39791386的博客 4464
上一篇: C#、.NET Framework、CLR的关系
下一篇: csscript应用程序拓展
It_sharp
博客等级 码龄10年 51粉丝 231原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值