首页 > 其他分享 >【GZIP压缩的二进制数据】

【GZIP压缩的二进制数据】

时间:2024-07-04 22:26:56浏览次数:22  
标签:HTTP 二进制 压缩 IOException GZIP byte 数据 out

目录

在这里插入图片描述
欢迎关注微信公众号:数据科学与艺术 作者WX:superhe199

直接在自定义协议中嵌入GZIP压缩的二进制数据需要确保数据能够跨系统边界正确传输。这意味着,你需要在JSON之外定义一种方式来标记二进制数据的开始和结束,以及可能的长度信息。由于标准JSON不直接支持二进制数据,以下示例将展示如何在HTTP请求/响应上下文中实现这一需求,而不是直接在JSON内部嵌入二进制数据。如果必须通过JSON传输元数据,可以仅在JSON中携带关于二进制数据位置和长度的指示信息,而实际数据则通过HTTP Body或其他二进制安全通道传输。

方案概览

HTTP传输:利用HTTP的多部分(multipart)表单数据或直接发送二进制流。
自定义头部:在HTTP头部包含元数据,如压缩数据的长度。
示例:HTTP多部分表单数据
发送端

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.zip.GZIPOutputStream;

public class GzipCustomProtocolSender {
    public static void main(String[] args) throws IOException {
        URL url = new URL("http://your-api-endpoint.com/upload");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");

        try (OutputStream out = connection.getOutputStream()) {
            // 写入二进制数据的边界和头部
            writeBoundary(out, "----WebKitFormBoundary7MA4YWxkTrZu0gW");

            // 写入GZIP压缩的数据
            String originalData = "Your data here";
            byte[] compressedData = gzipCompress(originalData.getBytes(StandardCharsets.UTF_8));
            writeHeader(out, "Content-Disposition: form-data; name=\"gzipData\"");
            out.write(compressedData);

            // 结束边界
            writeEndBoundary(out, "----WebKitFormBoundary7MA4YWxkTrZu0gW");

            // 发送请求
            connection.connect();
        }

        int responseCode = connection.getResponseCode();
        System.out.println("Response Code : " + responseCode);
    }

    private static void writeBoundary(OutputStream out, String boundary) throws IOException {
        out.write(("--" + boundary + "\r\n").getBytes());
    }

    private static void writeHeader(OutputStream out, String header) throws IOException {
        out.write((header + "\r\n\r\n").getBytes());
    }

    private static void writeEndBoundary(OutputStream out, String boundary) throws IOException {
        out.write(("\r\n--" + boundary + "--\r\n").getBytes());
    }

    private static byte[] gzipCompress(byte[] data) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try (GZIPOutputStream gzipOut = new GZIPOutputStream(baos)) {
            gzipOut.write(data);
        }
        return baos.toByteArray();
    }
}

接收端(服务器端伪代码)
服务器端的处理取决于使用的Web框架,但核心思想是识别出多部分表单数据中的二进制部分,然后解压。以下是一个非常基础的Java Servlet示例:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Part part = request.getPart("gzipData"); // 假设表单字段名为gzipData
    InputStream inputStream = part.getInputStream();
    byte[] gzipData = inputStream.readAllBytes();
    byte[] decompressedData = gzipDecompress(gzipData);
    // 处理解压后的数据...
}

private static byte[] gzipDecompress(byte[] data) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try (GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(data))) {
        byte[] buffer = new byte[1024];
        int len;
        while ((len = gis.read(buffer)) > -1) {
            baos.write(buffer, 0, len);
        }
    }
    return baos.toByteArray();
}

上述示例通过HTTP多部分表单数据传输GZIP压缩的数据,避免了Base64编码带来的额外开销。
确保接收端能够正确解析多部分表单数据,并识别出GZIP压缩的数据部分。
这种方式绕过了在JSON中直接嵌入二进制数据的限制,但需要客户端和服务端都按照约定的协议处理数据。
比如在不同的网络协议或框架下,处理方式可能有所不同。

标签:HTTP,二进制,压缩,IOException,GZIP,byte,数据,out
From: https://blog.csdn.net/qq_31532979/article/details/139954460

相关文章

  • 翻转一个整数的二进制数
    /** 翻转一个整数的二进制数*/#include<stdint.h>#include<stdio.h>uint32_treverse_bits(uint32_tn){//交换相邻位n=((n&0xAAAAAAAA)>>1)|((n&0x55555555)<<1);//交换每2位n=((n&0xCCCCCCCC)>>2)......
  • 【Python】基于动态规划和K聚类的彩色图片压缩算法
    引言当想要压缩一张彩色图像时,彩色图像通常由数百万个颜色值组成,每个颜色值都由红、绿、蓝三个分量组成。因此,如果我们直接对图像的每个像素进行编码,会导致非常大的数据量。为了减少数据量,我们可以尝试减少颜色的数量,从而降低存储需求。1.主要原理(一)颜色聚类(ColorClusterin......
  • IDA7.7 使用IDAPython搜索指定模式的二进制数据方法
    新版的ida弃用了idc.find_binary推荐使用ida_bytes.bin_search方法。ida_bytes.bin_search需要和ida_bytes.parse_binpat_str配合使用。ida_bytes.parse_binpat_str的功能类似于对正则表达式进行编译。ida_bytes.parse_binpat_str官方文档importida_bytesimportidaapiimpo......
  • 【鸿蒙性能优化】基于Camera Kit,获取相机流数据传递给native,进行压缩编码
    示例场景:ATS侧启动相机,使用摄像头采集视频流数据,获取相机视频流数据传递到native侧,通过buffer模式将视频编码成MP4文件保存到沙箱路径。方案描述:具体实现步骤可分为:Step1:申请权限,启动相机。Step2:启动录制,获取视频流数据,获取一帧图像转成JPG格式保存到沙箱路径。Step3:......
  • 三种简单的PDF文件快速压缩方法
    在日常工作中,我们经常会遇到需要发送或上传PDF文件的情况。然而,PDF文件往往会占用较大的存储空间,给我们的文件管理和传输带来了一定的困扰。因此,学会pdf压缩怎么弄就显得尤为重要了。接下来,我们将介绍四种简单有效的方法,帮助你轻松解决PDF文件压缩的问题。方法一、使用在线pdf压......
  • 设置Accept-Encoding为gzip,deflate,返回的网页是乱码
    设置Accept-Encoding为gzip,deflate,返回的网页是乱码用C#写代码去获取网页内容。 其中request的header中,设置Accept-Encoding为gzip,deflate:req=(HttpWebRequest)WebRequest.Create(gSkydriveUrl);req.Headers.Add("Accept-Encoding","gzip,deflate");结果始终......
  • 压缩包指令
    .tar解包:tarxvfFileName.tar打包:tarcvfFileName.tarDirName.gz解压1:gunzipFileName.gz解压2:gzip-dFileName.gz压缩:gzipFileName.tar.gz和.tgz解压:tarzxvfFileName.tar.gz压缩:tarzcvfFileName.tar.gzDirName—————......
  • 二进制中为什么负数是正数取反再加一
    二进制中的负数表示有一个重要的概念是补码,它是由对应正数二进制取反后再加1得到的。但是经常忘记为什么要这么表示,这里结合chatgpt解释做个简单的总结。补码(Two'sComplement)设计的逻辑来自于简化和统一计算机中有符号数的表示和运算。其设计逻辑可以追溯到计算机科学中的一......
  • 有手就会的 Java 处理压缩文件
    @目录前言背景第一步:编写代码1.1请求层1.2业务处理层1.3新增配置第二步:解压缩处理2.1引入依赖2.2解压缩工具类总结前言请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、提示:以下是本篇文章正文内容,下面案例可供参考背景在项目出现上传文件,其中文件包含压缩包,......
  • Linux—— 逻辑运算符,压缩和解压缩
     --a:and逻辑与  --o:or逻辑或  --not:not逻辑非  -优先级:与>或>非```shell[root@server~]#find / -size +10k -a -size -50k[root@server~]#find /etc  -name "e*" -o -name "f*"[root@server~]#find /etc  -nam......