`
lvxing607
  • 浏览: 79099 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

手机端后台向前台传输数据的二进制压缩方法

 
阅读更多
后端取出数据后发给前端,原本我们使用json格式传输,每次传输将近1k左右,但是为了给用户省流量,我们采取先把json去掉每一个key,转换为二进制,然后gzip压缩,这样操作下来节省了70%的数据量,效果很好。

具体方法:
原有返回格式是这样
<StoresList>
<return>
      {
      "status": {
      "request_status": "0",
      "error_code": "BTMes0100002",
      "error_msg": "success"
      },
      "bizobj": [
      {
      "STORE_ID": 1,
      "STORE_NAME": "肯德基",
      "STORE_PHONE": "4008-823823",
      "STORE_ADDRESS": "文二路肯德基店",
      "STORE_LAT": "30.33331",
      "STORE_LONG": "120.22221",
      "PHOTO_TYPE": 2,
      "RESOLUTION_TYPE": 2,
      "PHOTO_URL": "http://www.kendeji.com/a.jpg"
      }, {
      "STORE_ID": 2,
      "STORE_NAME": "麦当劳",
      "STORE_PHONE": "15233336666",
      "STORE_ADDRESS": "文一路麦当劳店",
      "STORE_LAT": "30.33332",
      "STORE_LONG": "120.22222",
      "PHOTO_TYPE": 2,
      "RESOLUTION_TYPE": 2,
      "PHOTO_URL": "http://www.maidanglao.com/a.jpg"
      }  ],
      "page_info": {
      "cur_page": "1",
      "page_size": "12",
      "total_items": "3"
      }
      }
    </return>
  </StoresList>



我们约定每一个属性的长度,在一个xml文件中写成这样
<storeList id="status">							
	<request_status>4</request_status>
	<error_code>4</error_code>
	<error_msg>40</error_msg>	
</storeList>	
<storeList id="page_info">
	<cur_page>4</cur_page>
	<page_size>4</page_size>
	<total_items>4</total_items>	
</storeList>	
<storeList id="bizobj">		
		<STORE_ID>4</STORE_ID>
		<STORE_NAME>50</STORE_NAME>
		<STORE_PHONE>16</STORE_PHONE>
		<STORE_ADDRESS>50</STORE_ADDRESS>			
		<STORE_LAT>12</STORE_LAT>
		<STORE_LONG>12</STORE_LONG>		
		<PHOTO_TYPE>4</PHOTO_TYPE>
		<RESOLUTION_TYPE>4</RESOLUTION_TYPE>		
		<PHOTO_URL>50</PHOTO_URL>		
		<CLASS_ID>4</CLASS_ID>			
		<STORE_URL>50</STORE_URL>	
		<distance>6</distance>	
</storeList>

然后依次遍历每个storelist下的节点的ElementName以及ElementValue ,即可通过elementName得到json中的值,通过elementValue来给json中的值转换为byte[],并且前补零。
最后把要拼装的jsonobject或者jsonarray的byte数组拼装成一个byte【】,然后对其gzip即可
public class BinaryUtil {
	/**
	 * jsonobj转换为byte数组
	 * @param jsonObj
	 * @param charset
	 * @param xmlParameter
	 * @return
	 * @throws UnsupportedEncodingException
	 * @throws DocumentException
	 */
	public static byte[] convertJsonObj2ByteArray(JSONObject jsonObj, String charset,
			XmlParameter xmlParameter) throws UnsupportedEncodingException,
			DocumentException {
		List<Jsonvalue> list = new ArrayList<Jsonvalue>();
		List<XmlBean> xmllist = combineBizobj(xmlParameter);
		for (XmlBean bean : xmllist) {
			String name = jsonObj.getString(bean.getAttributeName());
			Integer value = bean.getAttributeValue();
			list.add(change2Jsonvalue(name, value, charset));
		}
		return combineList(list, charset);
	}

	/**
	 * jsonarray转换为byte数组
	 * @param jsonArray
	 * @param charset
	 * @param xmlParameter
	 * @return
	 * @throws DocumentException
	 * @throws UnsupportedEncodingException
	 */
	public static byte[] convertJsonArray2ByteArray(JSONArray jsonArray,
			String charset, XmlParameter xmlParameter)
			throws DocumentException, UnsupportedEncodingException {
		if (jsonArray == null) {
			return null;
		}
		int arraySize = jsonArray.size();
		List<Jsonvalue> list = new ArrayList<Jsonvalue>();
		List<XmlBean> xmllist = combineBizobj(xmlParameter);
		for (int i = 0; i < arraySize; i++) {
			for (XmlBean bean : xmllist) {
				String name = jsonArray.getJSONObject(i).getString(
						bean.getAttributeName());
				Integer value = bean.getAttributeValue();
				list.add(change2Jsonvalue(name, value, charset));
			}
		}
		return combineList(list, charset);
	}

	/**
	 * 合并多个byte数组,合并后的长度为多个子数组的和
	 * @param charset
	 * @param firstByteArray
	 * @param secondByteArray
	 * @param objects
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	public static byte[] combineByteArray(String charset,byte[] firstByteArray,
			byte[] secondByteArray, Object... objects) throws UnsupportedEncodingException {
		if (firstByteArray == null) {
			return secondByteArray;
		} else if (secondByteArray == null) {
			return firstByteArray;
		} else {
			StringBuffer sb=new StringBuffer();
			sb.append(new String(firstByteArray));
			sb.append(new String(secondByteArray));
			
			if (objects != null) {
				int j = objects.length;
				for(int i=0;i<j;i++){
					sb.append(new String((byte[])objects[i]));
				}
			}
			return sb.toString().getBytes(charset);
		}
	}

	/**
	 * 获得一个接口对应的所有的id
	 * @param xmlParameter
	 * @return
	 * @throws DocumentException
	 */
	public static List<String> getIds(XmlParameter xmlParameter)
			throws DocumentException {
		List<String> list = new ArrayList<String>();
		List<Element> elist = getElementList(xmlParameter);
		for (Element e : elist) {
			list.add(e.attributeValue("id"));
		}
		return list;
	}
	
	/**
	 * gzip压缩数据
	 * @param data
	 * @return
	 * @throws IOException
	 */
	public static byte[] gzipData(byte[] data) throws IOException {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		GZIPOutputStream gzos = new GZIPOutputStream(bos);
		gzos.write(data);
		gzos.close();
		return bos.toByteArray();
	}

	/**
	 * 获得接口名称对应的配置元素列表
	 * @param method
	 * @return
	 * @throws DocumentException
	 */
	@SuppressWarnings("unchecked")
	private static List<Element> getElementList(XmlParameter xmlParameter)
			throws DocumentException {
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read(xmlParameter.getXmlPath());
		Element root = document.getRootElement();
		List<Element> elist = root.selectNodes(xmlParameter.getElementName());
		return elist;
	}

	

	private static byte[] combineList(List<Jsonvalue> list, String charset)
			throws UnsupportedEncodingException {
		StringBuffer result = new StringBuffer();
		for (int i = 0; i < list.size(); i++) {
			result.append(new String(list.get(i).getB()));
		}
		String f = result.toString();
		return f.getBytes(charset);
	}

	/**
	 * 前补零
	 * @throws UnsupportedEncodingException 
	 */
	private static byte[] fillZero(String charset,byte[] s, int bytesSize) throws UnsupportedEncodingException {
		byte[] zreo = new byte[1];
		zreo[0] = 0;
		while (s.length < bytesSize) {
			s = combineByteArray(charset,zreo, s);
		}
		return s;
	}

	private static Jsonvalue change2Jsonvalue(String value, Integer length,
			String charset) throws UnsupportedEncodingException {
		Jsonvalue jv = new Jsonvalue(fillZero(charset,value.getBytes(charset), length),
				length);
		return jv;
	}

	/**
	 * 获得一个element对应的所有节点
	 * 
	 * @param xmlParameter
	 * @return
	 * @throws DocumentException
	 */
	@SuppressWarnings("unchecked")
	private static List<XmlBean> combineBizobj(XmlParameter xmlParameter)
			throws DocumentException {
		List<XmlBean> list = new ArrayList<XmlBean>();
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read(xmlParameter.getXmlPath());
		Element root = document.getRootElement();
		List<Element> elist = root.selectNodes(xmlParameter.getElementName());
		for (Element e : elist) {
			if (e.attribute("id").getValue()
					.equalsIgnoreCase(xmlParameter.getElementId())) {
				List<Element> list1 = e.elements();
				for (Element ee : list1) {
					XmlBean xmlBean = new XmlBean(ee.getName(),
							Integer.parseInt(ee.getData().toString()));
					list.add(xmlBean);
				}
			}
		}
		return list;
	}
}


压缩包见附件包含本身的jar以及依赖的jar
分享到:
评论
1 楼 huazhebia 2017-01-18  
那前端怎么解压缩呢,jquery

相关推荐

    JavaScript读二进制文件并用ajax传输二进制流的方法

    在JavaScript中,处理二进制文件并使用Ajax传输二进制流是一项常见的任务,尤其是在进行文件上传或数据传输时。由于浏览器之间的差异,实现这一功能需要考虑不同的API和兼容性问题。以下是一份详细的指南,涵盖了...

    SQLSERVER_后台导入二进制数据方法.doc

    SQLSERVER 后台导入二进制数据方法 SQL Server 是一种功能强大的关系数据库管理系统,它提供了多种方式来导入二进制数据,包括使用 BULK INSERT 指令、使用 OPENROWSET 函数、使用 XML 等。但是在某些情况下,我们...

    十进制转二进制的方法

    本文将详细介绍十进制转二进制的方法,并对二进制转十进制、八进制、十六进制的转换方法进行比较和分析。 一、十进制转二进制 十进制转二进制的算法是许多初学者头疼的问题,但实际上这是一种简单的除法算法。具体...

    API POST发送数据支持二进制

    此外,考虑到网络带宽和服务器性能,优化数据传输和处理过程也很重要,比如通过压缩二进制数据减少传输大小。 总之,“API POST发送数据支持二进制”是一个涉及HTTP协议、数据编码、API接口设计和编程实现等多个...

    C++实现string存取二进制数据的方法

    在将string对象中的二进制数据写回网络时,使用`c_str()`方法获取原始字符数组,并使用`length()`或`size()`方法提供数据长度: ```cpp boost::asio::write(sockClient, boost::asio::buffer(strData.c_str(), ...

    图片压缩(java)将图片压缩后以二进制的形式输出

    * 压缩图片,将图片压缩后以二进制的形式输出 * * @param file * 将要压缩的图片 * @param width * 压缩宽(长度短的做宽) * @param height * 压缩长(长度长的做长) * @return byte[]二进制流 */

    报文传输中的进制转换(十六进制、二进制)

    在IT行业中,数据的传输和处理常常涉及到不同的进制转换,包括从十进制到二进制或十六进制的转换。这篇博文“报文传输中的进制转换(十六进制、二进制)”可能深入探讨了这些基础但至关重要的概念。在计算机科学中,...

    C#中使用二进制和ProtoBuf分别进行序列化、反序列化、压缩、解压缩对比测试示例源码.zip

    通过这个示例,开发者可以了解到在C#环境中如何使用二进制序列化和ProtoBuf,以及如何结合压缩技术来优化数据传输。对于需要处理大量数据或频繁进行网络通信的项目来说,选择高效的数据序列化和压缩方法至关重要,...

    易语言源码易语言字节集到二进制互转源码.rar

    2. **网络通信**:在网络编程中,数据通常以二进制流的形式传输,接收端需要将接收到的字节流转换为字节集,再进一步解析为所需的数据结构。 3. **数据解码编码**:在加密、解密或编码解码过程中,数据可能需要在...

    Kotlin二进制读写方法

    Kotlin二进制读写方法.Kotlin二进制读写方法.Kotlin二进制读写方法.Kotlin二进制读写方法.Kotlin二进制读写方法.

    汉字转化成二进制的方法

    了解并掌握汉字转化为二进制的方法,对于进行中文信息处理、编程、网络传输以及数据存储等任务都极其重要。通过深入理解这些知识点,开发者可以更好地处理涉及汉字的数据,确保其在不同环境下的正确性和一致性。

    数据二进制转换器转换器

    数据二进制转换器是一种非常实用的工具,它主要用于将我们日常生活中常用的数据类型转换为二进制形式。在计算机科学和信息技术领域,二进制是所有计算的基础,因为计算机内部只能理解和处理二进制数据,即由0和1组成...

    二进制数据二进制数据二进制数据

    二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据二进制数据

    二进制流形式上传图片,然后前台显示图片示例(vs2005+sql2005)

    在IT领域,尤其是在Web开发中,将图片以二进制流的形式存储在数据库中是一种常见的做法,这在处理大量图像数据或需要高效访问时尤其有用。本示例以Visual Studio 2005 (VS2005) 和 SQL Server 2005 (SQL2005) 为开发...

    二进制判断数据类型

    二进制文件上传分类,需要的下载, 通常对用户上传的图片需要保存到数据库中。...另一种是将图片以二进制数据流的形式直接写入数据库字段中。以下为具体方法:  一、保存图片的上传路径到数据库:

    bes二进制查看工具

    二进制数据是计算机技术的基础,是信息存储和传输的基本形式。为了满足专业人员对数据深入分析的需求,“besnew二进制查看工具”应运而生,它提供了专业、全面的二进制数据查看、分析和处理功能。 这款工具的设计初...

    BES二进制文件编辑器

    - **数据分析**:数据科学家在分析非结构化数据时,可能会用到二进制文件,编辑器可以帮助他们解析和修改数据。 - **系统维护**:系统管理员在处理硬件驱动、固件更新等任务时,也需要对二进制文件进行操作。 - *...

    bmp转二进制工具

    在计算机科学和编程领域,有时需要将BMP图像转换为二进制数据,以便于存储、传输或者进行低级操作,如嵌入固件或进行数据分析。"bmp转二进制工具"就是专门为此目的设计的应用程序。 首先,我们需要理解BMP文件的...

    web前端js显示后台接口pdf二进制流文件

    在这个场景中,"web前端js显示后台接口pdf二进制流文件"涉及到的技术点主要包括Web浏览器如何通过JavaScript处理从服务器获取的PDF二进制流数据,以及如何利用特定的库如PDF.js来在浏览器中直接展示PDF内容。...

Global site tag (gtag.js) - Google Analytics