`
lhx1026
  • 浏览: 308283 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

将.net传过来的二进制字符串转换成java的byte[]

    博客分类:
  • java
阅读更多

    今天要用java调用一个同事写的.net的webService的一个方法,这个方法会返回文件的二进制字符串内容。他使用的方法如下所示:

 

Convert.ToBase64String((byte[])dr["attachment"]);

 

    我这边用java获得的二进制字符串内容要转成byte[]类型才能用IO操作保存到文件中,但是如果只是用得到的字符串简单的使用下面的方法转成byte[]的话,是错误 的。

 

 

byte[] content = element.getAttributeValue("content").getBytes();

 

    因为以上的代码没有对获得二进制字符串进行解码,因此使用上面的代码保存的文件是错误的。

 

    有两种方法可以对上面获得二进制内容进行解码:

 

   一、使用sun.misc.BASE64Decoder

 

    要使用sun.misc.BASE64Decoder对二进制字符串进行解码,这个类在jdk的rt.jar包里面。其内容如下所示:

 

/*
 * Copyright 1995-2000 Sun Microsystems, Inc.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Sun designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Sun in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */
package sun.misc;

import java.io.OutputStream;
import java.io.PushbackInputStream;

import sun.misc.CEFormatException;
import sun.misc.CEStreamExhausted;
import sun.misc.CharacterDecoder;
import sun.misc.CharacterEncoder;

/**
 * This class implements a BASE64 Character decoder as specified in RFC1521.
 * 
 * This RFC is part of the MIME specification which is published by the Internet
 * Engineering Task Force (IETF). Unlike some other encoding schemes there is
 * nothing in this encoding that tells the decoder where a buffer starts or
 * stops, so to use it you will need to isolate your encoded data into a single
 * chunk and then feed them this decoder. The simplest way to do that is to read
 * all of the encoded data into a string and then use:
 * 
 * <pre>
 * byte mydata[];
 * BASE64Decoder base64 = new BASE64Decoder();
 * 
 * mydata = base64.decodeBuffer(bufferString);
 * </pre>
 * 
 * This will decode the String in <i>bufferString</i> and give you an array of
 * bytes in the array <i>myData</i>.
 * 
 * On errors, this class throws a CEFormatException with the following detail
 * strings:
 * 
 * <pre>
 * &quot;BASE64Decoder: Not enough bytes for an atom.&quot;
 * </pre>
 * 
 * @author Chuck McManis
 * @see CharacterEncoder
 * @see BASE64Decoder
 */

public class BASE64Decoder extends CharacterDecoder {

	/** This class has 4 bytes per atom */
	protected int bytesPerAtom() {
		return (4);
	}

	/** Any multiple of 4 will do, 72 might be common */
	protected int bytesPerLine() {
		return (72);
	}

	/**
	 * This character array provides the character to value map based on
	 * RFC1521.
	 */
	private final static char pem_array[] = {
	// 0 1 2 3 4 5 6 7
			'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 0
			'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 1
			'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 2
			'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', // 3
			'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', // 4
			'o', 'p', 'q', 'r', 's', 't', 'u', 'v', // 5
			'w', 'x', 'y', 'z', '0', '1', '2', '3', // 6
			'4', '5', '6', '7', '8', '9', '+', '/' // 7
	};

	private final static byte pem_convert_array[] = new byte[256];

	static {
		for (int i = 0; i < 255; i++) {
			pem_convert_array[i] = -1;
		}
		for (int i = 0; i < pem_array.length; i++) {
			pem_convert_array[pem_array[i]] = (byte) i;
		}
	}

	byte decode_buffer[] = new byte[4];

	/**
	 * Decode one BASE64 atom into 1, 2, or 3 bytes of data.
	 */
	protected void decodeAtom(PushbackInputStream inStream,
			OutputStream outStream, int rem) throws java.io.IOException {
		int i;
		byte a = -1, b = -1, c = -1, d = -1;

		if (rem < 2) {
			throw new CEFormatException(
					"BASE64Decoder: Not enough bytes for an atom.");
		}
		do {
			i = inStream.read();
			if (i == -1) {
				throw new CEStreamExhausted();
			}
		} while (i == '\n' || i == '\r');
		decode_buffer[0] = (byte) i;

		i = readFully(inStream, decode_buffer, 1, rem - 1);
		if (i == -1) {
			throw new CEStreamExhausted();
		}

		if (rem > 3 && decode_buffer[3] == '=') {
			rem = 3;
		}
		if (rem > 2 && decode_buffer[2] == '=') {
			rem = 2;
		}
		switch (rem) {
		case 4:
			d = pem_convert_array[decode_buffer[3] & 0xff];
			// NOBREAK
		case 3:
			c = pem_convert_array[decode_buffer[2] & 0xff];
			// NOBREAK
		case 2:
			b = pem_convert_array[decode_buffer[1] & 0xff];
			a = pem_convert_array[decode_buffer[0] & 0xff];
			break;
		}

		switch (rem) {
		case 2:
			outStream.write((byte) (((a << 2) & 0xfc) | ((b >>> 4) & 3)));
			break;
		case 3:
			outStream.write((byte) (((a << 2) & 0xfc) | ((b >>> 4) & 3)));
			outStream.write((byte) (((b << 4) & 0xf0) | ((c >>> 2) & 0xf)));
			break;
		case 4:
			outStream.write((byte) (((a << 2) & 0xfc) | ((b >>> 4) & 3)));
			outStream.write((byte) (((b << 4) & 0xf0) | ((c >>> 2) & 0xf)));
			outStream.write((byte) (((c << 6) & 0xc0) | (d & 0x3f)));
			break;
		}
		return;
	}
}

 

在使用的时候只要使用以下代码就可以将二进制字符串解码为byte[]:

 

public byte[] getContent(String binaryData){

		BASE64Decoder base64 = new BASE64Decoder();
		byte[] byteContent = base64.decodeBuffer(binaryData);
                return byteContent;
}

 

解码之后使用IO的操作方法就可以把二进制内容保存为文件:

 

/**  
	    * 将数据写入文件 
	    * @param data byte[] 
	    * @throws IOException 
	    */  
	 public static void writeFile(byte[] data,String filename){  
		 
		 try{
	     File file =new File(filename);  
	     BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(new FileOutputStream(file));  
	     bufferedOutputStream.write(data);  
	     bufferedOutputStream.flush();
	     bufferedOutputStream.close();  
		 }catch(IOException e){
			e.printStackTrace(); 
		 }
	   
	 }
 

    二、使用apache的commons-codec 项目。

    因为上面的sun.misc.BASE64Decoder在jdk的rt.jar包中,对于没有安装jdk,只安装了jre的环境来说使用不方便。所以笔者倾向于使用apache的commons-codec项目。

 

在使用的时候只要使用以下代码就可以将二进制字符串解码为byte[]:

 

public byte[] getContent(String binaryData){

		Base64 base64 = new Base64();
		byte[] byteContent = base64.decode(binaryData);
                return byteContent;
}
 

解码之后使用IO的操作方法就可以把二进制内容保存为文件:

 

/**  
	    * 将数据写入文件 
	    * @param data byte[] 
	    * @throws IOException 
	    */  
	 public static void writeFile(byte[] data,String filename){  
		 
		 try{
	     File file =new File(filename);  
	     BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(new FileOutputStream(file));  
	     bufferedOutputStream.write(data);  
	     bufferedOutputStream.flush();
	     bufferedOutputStream.close();  
		 }catch(IOException e){
			e.printStackTrace(); 
		 }
	   
	 }
 

 

0
0
分享到:
评论

相关推荐

    android byte字节数组转换十六进制字符串

    在Android开发中,有时我们需要将字节数组(byte array)转换为十六进制字符串,以便于数据存储、传输或调试。这是因为字节数组是二进制数据,而十六进制字符串则是一种人类可读的表示方式。下面我们将详细讨论如何...

    Java将字节转换为十六进制代码分享

    以下是一个简单的Java方法,用于将字节数组转换为十六进制字符串: ```java public static String bytesToHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append...

    Java 从网络中读取图片 转换成Base64字符串

    在Java编程中,将网络上的图片读取并转换为Base64字符串是一项常见的任务,尤其在Web开发中,这样的操作可以用于数据传输或者存储。Base64是一种编码方式,能够将二进制数据转化为可打印的ASCII字符,方便在网络上...

    java网络编程,UDP,发送16进制报文。

    上述代码中,`DatatypeConverter.parseHexBinary()`方法用于将16进制字符串转换为字节数组,然后创建一个`DatagramPacket`实例,包含数据和目标服务器的IP地址与端口。最后,通过`DatagramSocket`发送这个数据包。 ...

    十进制十六进制互相转换

    不过,大多数现代编程语言提供了将浮点数转换为十六进制字符串的函数,例如在Python中: ```python import struct float_value = 3.14159 hex_string = struct.pack('f', float_value).hex() # '40490fdb' ``` ...

    打开,保存,转化图片

    4. 从16进制字符串转换回图片: 当需要从16进制字符串还原图片时,首先要将其解析回字节数组,然后再重建原始图片文件。这涉及到将16进制字符串拆分成单个字符,组合成字节,并写入到新的文件中。在Python中,可以...

    华为U1900系列读取CDR话单,读取.bill二进制文件。 C#

    本篇将深入探讨如何使用C#语言来读取和解析华为U1900系列的`.bill`二进制话单文件。 首先,我们需要了解`.bill`文件的结构。华为的CDR文件通常包含头信息、话单记录和尾信息三个部分。头信息包含了文件的基本信息,...

    Java实现文件和base64流的相互转换功能示例

    Base64 解码是将 Base64 编码的字符串转换回原始的二进制数据。Java 中可以使用 BASE64Decoder 类来实现 Base64 解码。例如: ```java String base64String = ...; BASE64Decoder decoder = new BASE64Decoder(); ...

    .net基础知识ppt讲座

    C#与Java、C++的比较中,C#和C++都采用编译方式生成二进制可执行文件,并且都支持结构体。与Java相似,C#也有垃圾回收机制,以及类似的语法结构。然而,C#有自己的特点,如中间代码(IL)、基本数据类型、参数传递...

    Java实现文件格式转换代码实例

    例如,如果你想将转换后的MP3文件以Base64字符串的形式在网络上传输,可以这样做: ```java import java.nio.file.Files; import java.nio.file.Paths; import java.util.Base64; byte[] fileBytes = Files....

    Java实现斑马打印机ZPL指令打印,源码,可运行

    4. **序列化与解序列化**:在Java中,ZPL指令通常以字符串形式存在,可能需要进行字节流的转换,以便在网络上传输。这涉及到字符编码和字节流的操作,如`getBytes()`和`new String(byte[])`方法。 5. **设备通信...

    socket传输字节和字符串

    4. 数据发送:将字节或字符串转换为适合网络传输的形式,然后调用发送方法。 5. 数据接收:在接收端读取网络流,将接收到的字节还原为原始数据。 6. 错误处理:捕获和处理可能出现的异常,如连接失败、数据传输错误...

    net、asp、php三个平台的sha256加密

    这段代码首先将字符串转换为字节,然后通过SHA256.Create()创建一个SHA256实例,计算哈希,最后将哈希值转换为16进制字符串。 2. **ASP平台的SHA256加密**: ASP(Active Server Pages)通常与VBScript或JScript...

    java的api中文转码示例

    在上述代码中,我们先将字符串转换为字节数组,然后使用`Base64.getEncoder().encodeToString()`进行编码,解码时使用`Base64.getDecoder().decode()`将Base64字符串还原为字节数组,最后再转换回字符串。...

    Java 图片压缩

    `imageToBase64`方法读取指定路径的图片文件,将其内容转换为字节数组,然后使用`Base64.getEncoder().encodeToString()`方法编码为Base64字符串。 至于下载和修改图片路径,Java的标准库没有提供直接的下载功能,...

    base64加密commons-codec.jar

    在Java编程中,Base64是一种常见的数据编码方式,它将任意二进制数据转换为ASCII字符串,以便在网络上传输或者存储。`commons-codec.jar`是Apache Commons Codec库的一个JAR文件,这个库提供了多种编码算法,包括...

    java UDP报文的发送与接收

    这个数据可以是字符串、二进制数据等。如果数据是字符串,需要先将其转换为字节数组,例如使用`getBytes()`方法。 ```java String message = "Hello, UDP!"; byte[] data = message.getBytes(); ``` 3. **创建...

    关于微信小程序获取小程序码并接受buffer流保存为图片的方法

    在这个例子中,创建了一个`WxQRCodeModel`对象,设置了图片路径,并通过序列化工具(如Json.NET的`Serialize`方法)将其转化为JSON字符串,以便前端可以解析和使用。 在整个过程中,需要注意的是,微信接口可能有...

    DataBuffer在Java中使用ADO.NET源码示例

    当读取到二进制数据列时,可以使用JNBridge提供的方法将.NET的DataBuffer转换为Java的ByteBuffer或ByteArrayOutputStream。 6. **关闭资源**:执行完操作后,记得关闭DataReader、Connection以及任何其他打开的资源...

Global site tag (gtag.js) - Google Analytics