`
rejoices
  • 浏览: 3524 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

图形文件和二进制文件的相互转换

    博客分类:
  • IO
阅读更多
一 背景
   项目中掌机上传图片到web服务器并且在页面上展示,由于之前已采用webservice接口作为数据交互,所以必须把图片文件转换为二进制文件作为字符串随xml报文上传到主站,web服务器接收后解析。
   注意点:开发语言不通(java和.net),因此图片二进制文件需要base64转换(进过转换就变成utf-8字符集),否则生成图片异常。下面无论哪种方式都可以解析
   in = new ByteArrayInputStream(org.apache.axis.encoding.Base64.decode(imgStr));
   in = new ByteArrayInputStream(org.apache.commons.codec.binary.Base64.decodeBase64(imgStr.getBytes("UTF-8")));

二 代码
package picture;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import cn.hexing.ami.util.Coder;

/** 
 * @Description  xxxxx
 * @author  xxx
 * @Copyright 2014 hexing Inc. All rights reserved
 * @time:2014-7-10
 * @version 1.0 
 */
public class Server {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		saveToImgByBytes(new File("D:\\proccess1.png"), "d:\\pic.data");
		String imgStr = imgToString("d:\\pic.data");
		saveToImgByStr(imgStr, "d:\\pic.png");
	}
	
	/**
	 * 图形转换成二进制文件
	 * @param imgFile 图形文件
	 * @param sfile 二进制文件
	 * @return 
	 */
    public static int saveToImgByBytes(File imgFile, String sfile){
        int stateInt = 1;
        FileOutputStream fos = null;
        FileInputStream fis = null;
        	
        try{
            fos = new FileOutputStream(new File(sfile));
            fis = new FileInputStream(imgFile);
               
            byte[] b = new byte[1024];
            int nRead =0;
            while((nRead = fis.read(b)) != -1) {
                fos.write(b,0, nRead);
            }
            fos.flush();
         
 
        } catch(Exception e) {
            stateInt =0;
            e.printStackTrace();
        } finally {
        	try {
            	if(null != fos) 
            		fos.close();
            	if(null != fis) 
            		fis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}        	
        }

        return stateInt;
    }

	/**
	 * 读取二进制并生成字符串
	 * @param byteFile
	 * @return
	 */
	public static String imgToString(String byteFile) {
		ByteArrayOutputStream bos = null;
		BufferedInputStream bis = null;
		
		try{
			bos = new ByteArrayOutputStream();
			bis = new BufferedInputStream(new FileInputStream(byteFile));
			byte[] b = new byte[1024];
            int nRead = 0;
            while((nRead = bis.read(b)) != -1) {
            	bos.write(b, 0, nRead);
            }
            return Coder.encryptBASE64(bos.toByteArray());
		} catch(Exception e) {
			
		} finally {
			try {
            	if(null != bis) 
            		bis.close();
            	if(null != bos) 
            		bos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}      
		}
		
		return null;
	}
    
    /**
     * 生成图形
     * @param imgStr 二进制字符串
     * @param imgFile 图形文件
     * @return
     */
    public static int saveToImgByStr(String imgStr, String imgFile) {
        int stateInt = 1;
        InputStream in = null;
        FileOutputStream fos = null;
        
        try{
            in = new ByteArrayInputStream(Coder.decryptBASE64(imgStr));
            fos = new FileOutputStream(new File(imgFile));
               
            byte[] b =new byte[1024];
            int iRead =0;
            while((iRead = in.read(b)) != -1) {
                fos.write(b, 0, iRead);
            }
            
            fos.flush();
        } catch(Exception e) {
            stateInt =0;
            e.printStackTrace();
        } finally {
            try {
            	if(null != in) 
            		in.close();
            	if(null != fos) 
            		fos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
        }
        
        return stateInt;
  	 }    
    	
	//----------------------------------------------------------------------------------------
	public static byte[] imgByte(String txtFile) {
		try{
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			BufferedInputStream bis = new BufferedInputStream(new FileInputStream(txtFile));
			byte[] b = new byte[1024];
            int nRead =0;
            while((nRead = bis.read(b)) != -1) {
            	bos.write(b, 0, nRead);
            }
            return bos.toByteArray();
		} catch(Exception e){
			
		}
		return null;
	}

    //二进制文件转换成字符串
    public static int saveToImgByStr(byte[] imgStr, String imgFile) {
         int stateInt =1;
         
             try{
                 InputStream in = new ByteArrayInputStream(imgStr);
                 File file = new File(imgFile);
                 FileOutputStream fos = new FileOutputStream(file);
                    
                 byte[] b =new byte[1024];
                 int nRead =0;
                 while((nRead = in.read(b)) != -1) {
                     fos.write(b,0, nRead);
                 }
                 
                 fos.flush();
                 fos.close();
                 in.close();
      
             }catch(Exception e) {
                 stateInt =0;
                 e.printStackTrace();
             }finally{
             }
         
         return stateInt;
   	 }

    // 字符串转二进制
    public static byte[] hex2byte(String str) {
        if(str ==null)
            return null;
        str = str.trim();
        int len = str.length();
        if(len ==0|| len %2==1)
            return null;
        
        byte[] b =new byte[len /2];
        try{
            for(int i =0; i < str.length(); i +=2) {
                b[i /2] = (byte) Integer
                        .decode("0X"+ str.substring(i, i +2)).intValue();
            }
            return b;
        }catch(Exception e) {
            return null;
        }
    }
    
    // 二进制转字符串
    public static String byte2hex(byte[] b) {
        StringBuffer sb = new StringBuffer();
        String stmp ="";
        for(int n = 0; n < b.length; n++) {
            stmp = Integer.toHexString(b[n] &0XFF);
            if(stmp.length() ==1) {
                sb.append("0"+ stmp);
            }else{
                sb.append(stmp);
            }
        }
        return sb.toString();
    }    
}


package cn.hexing.ami.util;
import java.security.MessageDigest;

import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

import org.apache.axis.encoding.Base64;

/**
 * @Description xx
 * @author xx
 * @Copyright 2014 hexing Inc. All rights reserved
 * @time 2014-07-10
 * @version 1.0
 */
public abstract class Coder {
	public static final String KEY_SHA = "SHA";
	public static final String KEY_MD5 = "MD5";

	/**
	 * MAC算法可选以下多种算法
	 * HmacMD5 
	 * HmacSHA1 
	 * HmacSHA256 
	 * HmacSHA384 
	 * HmacSHA512
	 */
	public static final String KEY_MAC = "HmacMD5";

	/**
	 * BASE64解密
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static byte[] decryptBASE64(String key) throws Exception {
		return Base64.decode(key);
	}

	/**
	 * BASE64加密
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static String encryptBASE64(byte[] key) throws Exception {
		return Base64.encode(key);
	}

	/**
	 * MD5加密
	 * @param data
	 * @return
	 * @throws Exception
	 */
	public static byte[] encryptMD5(byte[] data) throws Exception {

		MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
		md5.update(data);

		return md5.digest();

	}

	/**
	 * SHA加密
	 * @param data
	 * @return
	 * @throws Exception
	 */
	public static byte[] encryptSHA(byte[] data) throws Exception {

		MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
		sha.update(data);

		return sha.digest();

	}

	/**
	 * 初始化HMAC密钥
	 * @return
	 * @throws Exception
	 */
	public static String initMacKey() throws Exception {
		KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);

		SecretKey secretKey = keyGenerator.generateKey();
		return encryptBASE64(secretKey.getEncoded());
	}
}



三 web服务器端实现
   方式1保存文件到数据库,一般文件不多图片很小可以用此种方式;方式2保存文件到服务器上,取文件相对路径保存到表中,推荐用第二种
分享到:
评论

相关推荐

    C# 浮点数与二进制之间的转换 源码

    了解浮点数与二进制之间的转换对于优化性能和理解底层机制至关重要。 标题“C# 浮点数与二进制之间的转换 源码”指的是一个C#程序,它提供了将浮点数转换为二进制表示(具体来说是四个字节)以及反向转换的实现。这...

    16进制 转换 bmp 转换16进制文本

    这种转换技术在软件开发中尤其有用,例如在调试过程中查看内存中的图像数据,或者在处理二进制文件时为了便于阅读和编辑。此外,它在安全领域也有应用,如分析病毒或恶意软件的二进制代码,以及在加密和解密算法中...

    将二进制格式的stl文件转换的文本格式的stl文件

    这个过程涉及到读取二进制文件中的原始数据,然后将其转化为可读的ASCII字符表示。转换过程中需要考虑到数据类型的转换,例如,二进制文件中的浮点数要转换为字符串形式,并按照ASCII STL的格式排列。 例如,一个名...

    常用进制转换程序

    本文将深入探讨标题为“常用进制转换程序”的项目,它支持二进制、十六进制、十进制和64进制之间的相互转换。这个程序是用C++语言编写的,这使得它在效率和灵活性方面具有优势。 C++是一种强大的、通用的编程语言,...

    易语言进制转换例程

    进制转换包括将数值从一种进制转换为另一种进制,例如二进制、八进制、十进制和十六进制之间的转换。 进制转换例程通常包含以下几个部分: 1. **数据输入**:用户或程序需要输入要转换的数值以及原始进制。 2. **...

    16进制转化为10进制软件

    这里需要注意的是,输出的“test1.exe”文件名可能有误,因为一般情况下,10进制数据转换后并不会生成另一个可执行文件,而是通常会保存为新的文本文件或二进制文件。如果“test1.exe”确实是一个可执行文件,那么...

    进制转换及字符ASCII

    "ASCII及进制转换_V4.0.exe"这个文件可能是一个应用程序,它提供了图形用户界面,帮助用户方便地进行进制转换和ASCII码的相互转换。用户只需输入数值或字符,软件会自动完成计算,极大地简化了手动计算的过程,提高...

    scratch编程项目源代码文件案例素材-二进制数与十进制数的转换.zip

    这个“二进制数与十进制数的转换”项目是针对初学者设计的一个典型示例,旨在帮助孩子们理解这两种数字系统之间的相互转换,并通过实际操作提升他们的逻辑思维能力。 首先,我们要了解二进制(Binary)和十进制...

    vc十六进制编辑器源码

    【VC十六进制编辑器源码】是一种专用于查看和编辑二进制文件的软件工具,它能够将文件内容以十六进制的形式显示出来。在编程领域,十六进制编辑器是开发者进行低级调试、数据解析和二进制文件操作的重要辅助工具。...

    易语言控制台进制转换源码.7z

    在这个“易语言控制台进制转换源码.7z”压缩包中,包含了使用易语言编写的控制台应用程序,其主要功能很可能是进行不同进制之间的数值转换,比如二进制、八进制、十进制和十六进制之间的相互转换。 在计算机科学中...

    hex文件转S19文件VC/MFC程序源代码.zip

    通过阅读和分析源代码,开发者可以深入了解二进制文件格式的细节,以及如何在Windows环境下使用C++和MFC开发图形应用程序。同时,这也是一个实际问题的解决方案,对于电子工程师和软件开发者来说,能够帮助他们快速...

    3款字符串、16进制、PE地址转换处理工具

    这些工具能够帮助开发者和安全研究人员更有效地理解和分析二进制文件,比如exe可执行文件或dll动态链接库。下面将详细解释这三个概念及其相互之间的转换处理。 首先,我们来看**字符串**。字符串是编程语言中的基本...

    dec-bin-hex.zip_DEC_HEX DEC_hex_visual basic_进制转换

    十进制是我们日常生活中的计数方式,而二进制和十六进制在计算机领域尤其重要,因为它们更符合计算机的二进制逻辑。二进制(Binary)是基于2的计数系统,而十六进制(Hexadecimal)是基于16的,通常用于简化二进制的...

    行业分类-外包设计-多参数相向同步递进加密二进制防伪印刷方法的介绍分析.rar

    在印刷过程中,这些二进制代码会被转化为肉眼可识别的图形,如点阵或条纹,同时保持其可读性以供机器验证。这种技术使得每一件印刷品都有独一无二的标识,增加了伪造的难度。 结合这两种技术,多参数相向同步递进...

    DICOM与BMP相互转换 c++代码 VS2010

    同时,理解二进制文件的读写机制,如何处理字节对齐和大小端问题也非常重要。你可能还需要学习如何使用DCMTK或其他图像处理库,了解它们的API和使用方法。 总的来说,DICOM与BMP之间的转换涉及到医学图像标准的理解...

    HEX和asiic转换小工具软件-amo的编程小工具集合.zip

    这可能是通过命令行界面或者图形用户界面实现的,便于开发者调试代码、分析数据或者理解二进制文件的内容。 转换工具通常会提供以下功能: 1. 输入HEX字符串并将其转换为ASCII文本。 2. 输入ASCII文本并将其转换为...

    工作小工具,16进制,RGB,IP转换,ASCII

    - RGB值可以以十进制整数形式(例如,RGB(255, 128, 0))或者16进制形式(#FF8000)表示,它们之间可以通过简单的数学运算相互转换。 3. **IP地址转换**: - IP地址(Internet Protocol Address)是互联网上设备...

    osgb/obj/ive格式相互转换

    osgb是OpenSceneGraph Binary Format的缩写,它是OpenSceneGraph(一个高性能的3D图形库)所使用的二进制文件格式。它包含了场景图、几何数据、纹理和动画等信息,具有紧凑的数据结构和快速的加载速度。osgb格式常...

    UTF8及各种字符串相互转换

    标题中的“UTF8及各种字符串相互转换”涉及的是字符编码和数据表示的领域,这是一个在计算机科学中至关重要的概念。UTF8是Unicode的一种实现方式,它是一种广泛使用的字符编码标准,能够表示世界上大部分语言的字符...

    初中/高中级别方程求解 2/8/10/16进制相互转换(含小数) 多卫星寻星指南

    本文将详细解析标题和描述中的三个主要知识点:初中/高中级别的方程求解,2/8/10/16进制之间的相互转换(包括小数),以及多卫星寻星指南。 首先,我们来探讨方程求解。在初中和高中阶段,数学课程通常会涵盖一元二...

Global site tag (gtag.js) - Google Analytics