XML中二进制数据的处理方法
原文链接:http://www.west263.com/www/info/22308-1.htm
在xml中,所有的数据都是以文本的形式来显示,但是二进制数据不能直接以文本格式来表示,那xml又是怎么处理二进制数据的呢?下面就来探讨一下。
为了简单和通用性,xml被设计成了以文本的格式来表示数据。在xml中,所有的数据都是以文本的格式来存储,二进制数据也不例外。在xml中,二进制数据也要被编码成文本的格式,发送到目的方。目的方接收到这个文本二进制数据以后,再以相同的解码程序解成相应的二进制数据,当然数据原来的格式,名称等辅助信息一定要当作相关信息一起发送。一般二进制数据编码成base64格式,它的优点是容易易于编码和解码,缺点是比纯的二进制多占用33%的存储空间。
下面是具体的程序实现:
<%@ page contenttype="text/html; charset=gb2312" %>
<%@ page import="java.io.*" %>
<%
string ret=new string();
try{
inputstream in=new fileinputstream("c:\\aaa.doc");
byte[] bytes=new byte[in.available()];
in.read(bytes);
ret=new sun.misc.base64encoder().encode(bytes); //具体的编码方法
in.close();
}
catch(filenotfoundexception e) {
e.printstacktrace();
}
catch(java.io.ioexception ex) {
ex.printstacktrace();
}
%>
ret就是最后的结果,编码以后就可以用标准的xml方式发送了。发送到目的方以后,还要对数据进行相应的解码,才能得到原来的二进制文件,解码的代码如下:
<%@ page contenttype="text/html; charset=gb2312" %>
<%@ page import="java.io.*" %>
<%
byte[] bytes = new sun.misc.base64decoder().decodebuffer(ret);
java.io.bytearrayinputstream instream=new java.io.bytearrayinputstream(bytes);
byte[] buffer =new byte[1444];
fileoutputstream fs=new fileoutputstream( "d:\\aaa.doc");
int bytesum=0;
int byteread=0;
while ((byteread=instream.read(buffer))!=-1) {
bytesum+=byteread;
fs.write(buffer,0,byteread);
}
%>
base64可以处理不太大的数据,如果要移动大量的数据,且要考虑空间/时间效率时,要采用其他的替代方法。
小龙评论:xml是一种很友好的数据存储介质,如果能实现二进制数据的处理,再加上本身对文本的支持,基本上就能应付常见的数据格式了,一些数据交换中间件巧妙的运用了xml的特性,实现了数据跨平台的传输
XML中二进制数据的处理方法的更多相关文章
- SQLServerException:将截断字符串或二进制数据的解决方法
SQLServerException:将截断字符串或二进制数据的解决方法: 最近使用JPA进行保存对象到数据库中怎么也添加不进去,始终报错 主要原因就是你增加的数据字段长度超过数据库中字段所定义长度, ...
- Base64就是一种 基于64个可打印字符来表示二进制数据的表示方法
Base64编码是从二进制到字符的过程. Base64编码主要用在传输.存储.表示二进制等领域,还可以用来加密,但是这种加密比较简单. byte[] byteArray = Encoding.UTF8 ...
- CSS控制XML与通过js解析xml然后通过html显示xml中的数据
使用CSS控制XML的显示 book.css bookname{ display:block;color:Red} author{ display:block;font-style:italic} p ...
- PatentTips - 在物联网中进行数据过滤的方法和装置
背景技术 [0001] 本发明涉及物联网,特别涉及在物联网进行数据过滤的方法和装置. [0002] 物联网是新一代信息技术的重要组成部分,特指物物相连的网络.具体地,物联网是指通过各种信息传感设备,如 ...
- 归纳从文件中读取数据的六种方法-JAVA IO基础总结第2篇
在上一篇文章中,我为大家介绍了<5种创建文件并写入文件数据的方法>,本节我们为大家来介绍6种从文件中读取数据的方法. 另外为了方便大家理解,我为这一篇文章录制了对应的视频:总结java从文 ...
- C#学习笔记3:提示“截断字符串或二进制数据”错误解决方法
1.调试程序如出现“截断字符串或二进制数据”的关于数据库的错误,可以先试一试修改数据库中字符定义的长度. 2.使用ManualResetEvent前需导入 命名空间System.Threading; ...
- Android之读取 AndroidManifest.xml 中的数据
转:http://www.2cto.com/kf/201208/151123.html 下来示例如何读取这些数据. 1 版本信息.应用名称 2 Appliction 的Meta-data 3 Acti ...
- excel中的数据导入oracle方法
SQL_loader批量上传数据 1. 注释 在工作中,很多时候会遇到如下情况:需要将excel中的数据批量上传到ORACLE表中.如果是小数据量,如几十条至几百条,那么用plsql dev工具 ...
- Spring MVC 返回 xml json pdf 数据的配置方法
<!-- Spring MVC 返回 xml 数据的配置方法 --> <bean class="org.springframework.web.servlet.vi ...
随机推荐
- (原)docker安装
2018直接看这里: https://docs.docker.com/cs-engine/1.12/#install-on-ubuntu-1404-lts-or-1604-lts 以下为原文: 网上的 ...
- 【驱动】linux驱动程序开发及环境搭建
1.mystery引入 1)设备驱动程序对外提供如下的功能: 1)设备初始化:对硬件设备进行初始化操作 2)数据交换:数据交换包括由内核层向硬件层传送数据.从硬件层读取数据 ...
- 使用 "java -jar"命令启动jar包时报不支持的jdk版本异常
在使用java -jar 命令启动一个jar包的时候,提示版本不支持: [root@hadoop01 eureka-server-master]# java -jar xuebusi-eureka-s ...
- 【Linux】crontab 每隔1小时 2小时的执行job写法
crontab -l crontab -e 每五分钟执行 */5 * * * * 每小时执行 0 * * * * 每2小时执行 0 */2 * * * 每天执行 0 0 ...
- 【linux】dpkg info修复及dpkg: warning: files list file for package
mv /var/lib/dpkg/info /var/lib/dpkg/info.bak //现将info文件夹更名 sudo mkdir /var/lib/dpkg/info //再新建一个新的in ...
- STM32内部flash存储小数——别样的C语言技巧
今天在进行STM32内部falsh存储的时候,发现固件库历程的函数原型是这样的: 第一个是地址,在我的STM32中是2K一页的,第二个是要写入的数据. 问题就来了,存储一个小数该怎么办呢?固件库给的是 ...
- JAVA-JSP内置对象之session对象获得session的其他信息
相关资料:<21天学通Java Web开发> session对象 获得session的其他信息 SessionDemo2.jsp <%@ page language="ja ...
- C#学习笔记(2)——操作sqlite数据库增删改查
说明(2017-5-25 10:49:50): 1. app.config文件 Alt+Shift+C创建类,选择“应用程序配置文件”,添加<connectionStrings>,要先打个 ...
- 16款纯CSS3实现的loading加载动画
分享16款纯CSS3实现的loading加载动画.这是一款实用的可替代GIF格式图片的CSS3加载动画代码.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div clas ...
- 【卡西欧Fx-5800p系列教程】Pol()和Rec()正反算妙用
一.背景概述 我要单独把这两个公式列出来写篇文章, 我觉得搞测量的如果能熟练运用 Pol()和Rec()这两个公式,那么他是会用卡西欧计算器的里程碑事件,也就是说,你开始入门了. 为什么呢?他虽然是内 ...