- 浏览: 307082 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (148)
- wicket (3)
- 算法,数据结构 (1)
- 其他 (1)
- jdbc (2)
- mysql (10)
- php (18)
- gwt中文文档 (0)
- jquery (2)
- smil教程 (2)
- 开源知识 (1)
- mms彩信 (2)
- java (12)
- centos (3)
- linux (2)
- php apc (1)
- java hibernate (4)
- xampp (1)
- tomcat (1)
- css调试 (3)
- jasperReport (3)
- js 效果 (3)
- apache (1)
- eclipse (6)
- ss7 (8)
- java log log4j (2)
- java jndi (1)
- ldap (2)
- activemq (3)
- spring security (4)
- java 注解 (0)
- thinking in java (3)
- hibernate (1)
- maven (1)
- wap push (2)
- memcached (7)
- java servlet (2)
- flash game (0)
- financial knowledge (6)
- protect eyes (1)
最新评论
-
u012359453:
我是Android开发的,最近需要做一个消息转发的后台,我写好 ...
使用Java Service Wrapper将java程序作为linux服务并且开机自动启动 -
zhcheng:
我就是按照你这个配置的,别的地方都没有问题,只有在使用标签的时 ...
spring security3.0的ACL使用例子 -
xjjaid13:
...
js实现图片左右滚动 -
bhdweb:
项目中的角色名是死的?直接用户注解写在方法上?
spring security3.0的ACL使用例子 -
hw1287789687:
根本原因:我实体类中的类型是raw,没法直接实例化的类型。pr ...
hibernate错误:Could not determine type for: java.util.Set
今天要用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> * "BASE64Decoder: Not enough bytes for an atom." * </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(); } }
发表评论
-
Java中的引用传递和值传递
2011-08-23 16:30 1850Java 中的基本数据类型 ... -
[转]Java入门--认识理解Java中native方法
2011-08-09 15:06 1015原文地址:http://www.enet. ... -
javadoc - Java API 文档生成器
2010-09-08 09:57 3107javadoc - Java API 文档生成器 从 J ... -
File中的delete()
2010-08-13 11:48 1084一般来说 java file.delete失败 有以下几个原因 ... -
[转]JAVA线程间通信问题
2010-06-12 16:49 1276问题 在前一小节,介绍了在多线程编程中使用同步机制的重要 ... -
[转]线程通信的两种方法
2010-06-12 15:36 1022原文地址: http://www.iteye.com/top ... -
[转]java读取文件及文件流
2010-06-01 15:59 2366java读取文件或是文件流的代码,涵盖了读取jar文件中的文件 ... -
使用xfire发布web service
2010-03-02 11:31 15461、首先,在http://xfire.codehaus.org ... -
java 使用相对路径读取文件
2010-02-24 11:36 19061.java project环境,使用java.io用相对路径 ... -
使用Java读取properties文件
2009-12-12 18:19 1270Properties prop = new Propertie ... -
java得到当前路径
2009-09-01 11:29 980JAVA怎样得到当前程序的路径呢?有两种方法 1 Syste ...
相关推荐
在Android开发中,有时我们需要将字节数组(byte array)转换为十六进制字符串,以便于数据存储、传输或调试。这是因为字节数组是二进制数据,而十六进制字符串则是一种人类可读的表示方式。下面我们将详细讨论如何...
以下是一个简单的Java方法,用于将字节数组转换为十六进制字符串: ```java public static String bytesToHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append...
在Java编程中,将网络上的图片读取并转换为Base64字符串是一项常见的任务,尤其在Web开发中,这样的操作可以用于数据传输或者存储。Base64是一种编码方式,能够将二进制数据转化为可打印的ASCII字符,方便在网络上...
上述代码中,`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中,可以...
本篇将深入探讨如何使用C#语言来读取和解析华为U1900系列的`.bill`二进制话单文件。 首先,我们需要了解`.bill`文件的结构。华为的CDR文件通常包含头信息、话单记录和尾信息三个部分。头信息包含了文件的基本信息,...
C#与Java、C++的比较中,C#和C++都采用编译方式生成二进制可执行文件,并且都支持结构体。与Java相似,C#也有垃圾回收机制,以及类似的语法结构。然而,C#有自己的特点,如中间代码(IL)、基本数据类型、参数传递...
例如,如果你想将转换后的MP3文件以Base64字符串的形式在网络上传输,可以这样做: ```java import java.nio.file.Files; import java.nio.file.Paths; import java.util.Base64; byte[] fileBytes = Files....
4. **序列化与解序列化**:在Java中,ZPL指令通常以字符串形式存在,可能需要进行字节流的转换,以便在网络上传输。这涉及到字符编码和字节流的操作,如`getBytes()`和`new String(byte[])`方法。 5. **设备通信...
4. 数据发送:将字节或字符串转换为适合网络传输的形式,然后调用发送方法。 5. 数据接收:在接收端读取网络流,将接收到的字节还原为原始数据。 6. 错误处理:捕获和处理可能出现的异常,如连接失败、数据传输错误...
这段代码首先将字符串转换为字节,然后通过SHA256.Create()创建一个SHA256实例,计算哈希,最后将哈希值转换为16进制字符串。 2. **ASP平台的SHA256加密**: ASP(Active Server Pages)通常与VBScript或JScript...
Base64 解码是将 Base64 编码的字符串转换回原始的二进制数据。Java 中可以使用 BASE64Decoder 类来实现 Base64 解码。例如: ```java String base64String = ...; BASE64Decoder decoder = new BASE64Decoder(); ...
在上述代码中,我们先将字符串转换为字节数组,然后使用`Base64.getEncoder().encodeToString()`进行编码,解码时使用`Base64.getDecoder().decode()`将Base64字符串还原为字节数组,最后再转换回字符串。...
`imageToBase64`方法读取指定路径的图片文件,将其内容转换为字节数组,然后使用`Base64.getEncoder().encodeToString()`方法编码为Base64字符串。 至于下载和修改图片路径,Java的标准库没有提供直接的下载功能,...
在Java编程中,Base64是一种常见的数据编码方式,它将任意二进制数据转换为ASCII字符串,以便在网络上传输或者存储。`commons-codec.jar`是Apache Commons Codec库的一个JAR文件,这个库提供了多种编码算法,包括...
这个数据可以是字符串、二进制数据等。如果数据是字符串,需要先将其转换为字节数组,例如使用`getBytes()`方法。 ```java String message = "Hello, UDP!"; byte[] data = message.getBytes(); ``` 3. **创建...
当读取到二进制数据列时,可以使用JNBridge提供的方法将.NET的DataBuffer转换为Java的ByteBuffer或ByteArrayOutputStream。 6. **关闭资源**:执行完操作后,记得关闭DataReader、Connection以及任何其他打开的资源...
在这个例子中,创建了一个`WxQRCodeModel`对象,设置了图片路径,并通过序列化工具(如Json.NET的`Serialize`方法)将其转化为JSON字符串,以便前端可以解析和使用。 在整个过程中,需要注意的是,微信接口可能有...