`
yiqieanhao
  • 浏览: 67268 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

文件,byte[],HexString 之间的转换

    博客分类:
  • JAVA
阅读更多
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 
 * 文件,byte[],HexString 之间的转换
 *
 */
public class FileDataConvert {

	public static void main(String[] args) {
		String srcFilePath = "d:/testFrom.png";
		String outFilePath = "d:/";
		String outFileName = "testTo.png";

		byte[] bytes = getBytesFromFile(srcFilePath);
		String str = bytes2HexString(bytes);
		System.out.println(str);

		byte[] bytes2 = hexString2Bytes(str);
		saveBytes2File(bytes2, outFilePath, outFileName);
	}
	
	/**
	 * 从文件中获取byte数组
	 */
	public static byte[] getBytesFromFile(String filePath) {
		byte[] buffer = null;
		try {
			File file = new File(filePath);
			FileInputStream fis = new FileInputStream(file);
			ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);
			byte[] b = new byte[1024];
			int n;
			while ((n = fis.read(b)) != -1) {
				bos.write(b, 0, n);
			}
			fis.close();
			bos.close();
			buffer = bos.toByteArray();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return buffer;
	}

	/**
	 * 根据byte数组生成文件
	 */
	public static void saveBytes2File(byte[] bfile, String filePath, String fileName) {
		BufferedOutputStream bos = null;
		FileOutputStream fos = null;
		File file = null;
		try {
			File dir = new File(filePath);
			if (!dir.exists() && dir.isDirectory()) {
				dir.mkdirs();
			}
			file = new File(filePath + "\\" + fileName);
			fos = new FileOutputStream(file);
			bos = new BufferedOutputStream(fos);
			bos.write(bfile);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (bos != null) {
				try {
					bos.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		}
	}

	/**
	 * 从字节数组到十六进制字符串转换
	 */
	public static String bytes2HexString(byte[] b) {
		byte[] buff = new byte[2 * b.length];
		for (int i = 0; i < b.length; i++) {
			buff[2 * i] = hex[(b[i] >> 4) & 0x0f];
			buff[2 * i + 1] = hex[b[i] & 0x0f];
		}
		return new String(buff);
	}

	/**
	 * 从十六进制字符串到字节数组转换
	 */
	public static byte[] hexString2Bytes(String hexstr) {
		byte[] b = new byte[hexstr.length() / 2];
		int j = 0;
		for (int i = 0; i < b.length; i++) {
			char c0 = hexstr.charAt(j++);
			char c1 = hexstr.charAt(j++);
			b[i] = (byte) ((parse(c0) << 4) | parse(c1));
		}
		return b;
	}

	private final static byte[] hex = "0123456789ABCDEF".getBytes();

	private static int parse(char c) {
		if (c >= 'a')
			return (c - 'a' + 10) & 0x0f;
		if (c >= 'A')
			return (c - 'A' + 10) & 0x0f;
		return (c - '0') & 0x0f;
	}
}
分享到:
评论
2 楼 yiqieanhao 2013-01-08  
fj1052 写道
parse方法中的"c >= 'a'"和"c - 'a' + 10"什么意思啊,运算我能看懂,就是不知道干什么?或者说,为什么要这么做

byte[]变hex字符串其实就是把byte[]里的每个byte变成2位的16进制的数值表示。把byte的高四位和低四位用"0123456789ABCDEF"来表示。
当反转时,取两位16进制数值变成byte,中间量为char.第一位16进制数值变成高四位,第二位16进制数值变成低四位。
int parse(char c) 就是将16进制数值char变成byte高4位或低4位的数值。(c - 'a' + 10) 是取得字符对应的值,& 0x0f是取后四位。"c >= 'a'"无非是判断以合适计算对应的值。
1 楼 fj1052 2013-01-08  
parse方法中的"c >= 'a'"和"c - 'a' + 10"什么意思啊,运算我能看懂,就是不知道干什么?或者说,为什么要这么做

相关推荐

    String(含Hex)与Byte数组互相转换[代码]

    在Java或类似的编程语言中,我们经常会遇到需要将字符串(String)与字节数组(Byte[])以及十六进制表示的字符串(Hex)进行相互转换的情况。这些转换在处理网络通信、文件存储、加密解密等领域尤为关键。下面我们...

    java中String_十六进制String_byte[]之间相互转换

    在Java开发中,字符串(String)、十六进制表示的字符串以及字节数组(byte[])之间的转换是非常常见的需求,尤其是在处理网络通信、文件读写等场景下。本文将详细介绍如何在Java中实现这些数据类型之间的相互转换,...

    hex2byte byte2hex

    例如,在网络通信、文件存储等场景中,经常需要将二进制数据(通常表示为`byte`数组)转换为十六进制字符串形式(即`hex`),或者相反地,将十六进制字符串转回二进制数据。这种需求催生了两个重要的函数:`hex2byte...

    Android byte[] 和 String互相转换

    在Android开发中,数据在内存和磁盘之间传输时,我们经常需要在`byte[]`(字节数组)和`String`之间进行转换。这是因为`byte[]`适合处理二进制数据,如图片、音频文件等,而`String`则更适合存储文本信息。本篇将...

    C#_string_byte数组转换解析

    在C#编程语言中,字符串(string)与字节数组(byte array)之间的转换是常见的操作,尤其在处理二进制数据、网络传输或文件读写时。本篇文章将详细解析C#中如何进行这两种数据类型的转换,并讨论转换过程中需要注意...

    C#编写的 Hex转string文件 串口下载数据

    本项目涉及的主题是"C#编写的Hex转string文件串口下载数据",这涵盖了两个主要方面:HEX文件处理和串口通信。下面我们将深入探讨这两个核心知识点。 首先,HEX文件处理是编程中常见的任务,尤其是在低级硬件交互...

    C# string byte数组转换解析.pdf

    在C#编程中,字符串(string)与字节(byte[])之间的转换是常见的操作,特别是在处理网络传输、文件存储或数据解析时。本文将详细讲解C#中如何进行这两种类型之间的转换,并提供一些实用的方法。 首先,我们来看如何将...

    C# string byte数组转换解析.docx

    在C#编程语言中,字符串(string)与字节数组(byte[])之间的转换是常见的操作,特别是在处理网络通信、文件读写或数据编码解码等场景。本篇文章将详细探讨C#中如何实现这两种类型之间的转换,并提供实用的代码示例...

    C#【文件操作篇】hex文件转bin文件

    在C#编程环境中,有时我们需要处理不同格式的二进制数据,例如将十六进制(Hex)文件转换为二进制(Bin)文件。这个过程通常涉及到对文件内容的读取、解析、转换以及写入等步骤。下面将详细探讨如何使用C#进行Hex到...

    byte数组转化为hex

    public static byte[] hexToBytes(String hex) { int len = hex.length(); byte[] data = new byte[len / 2]; for (int i = 0; i ; i += 2) { data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) ) + ...

    C#中Byte[]和String之间转换的方法

    在C#编程语言中,数据类型`Byte[]`(字节数组)和`String`之间的转换是非常常见的操作,特别是在处理文件、网络传输或数据存储时。这两种类型之间的转换涉及到字符编码的概念,因为字符需要通过特定的编码方式转换成...

    float型数据在内存中与HEX数据互相转换的代码

    在编程领域,尤其是在C++中,理解数据类型如`float`如何在内存中表示以及如何进行不同格式(如十六进制HEX)之间的转换是非常重要的。`float`型数据是用于存储浮点数的标准数据类型,它在内存中遵循特定的格式,即...

    Python hexstring-list-str之间的转换方法

    hexstring转换为整形列表 将`'53216A'`转换为`[0x53, 0x21, 0x6A]`。 **步骤**: - 使用`bytearray.fromhex()`函数将十六进制字符串转换为`bytearray`。 - 再将`bytearray`转换为列表。 **代码示例**: ```...

    将传进来的十六进制表示的字符串转换成byte数组 文件下载

    byte[] bytes = Convert.FromHex(hexString); ``` Python则有内置的`binascii`模块,可以方便地完成转换: ```python import binascii hexString = "your_hex_string" bytesArray = binascii.unhexlify(hexString)...

    16进制文件转换成byte及数组

    - **Java**:使用`Byte.parseByte(hexString, 16)`将16进制字符串转换为byte,使用`byte[] bytes = new byte[hexStringLength / 2]`创建数组,然后通过循环将byte值存入数组。 - **Python**:使用`bytes.fromhex...

    Go-此工具用于将16进制字符串转换成10进制byte数组

    通过上述介绍,我们可以看出这个工具在Go开发中扮演着重要角色,帮助开发者高效地处理16进制字符串与10进制byte数组之间的转换。如果你需要进一步了解或使用这个工具,可以查看`convert-master`压缩包内的源代码。

    C#16进制与字符串字节数组之间的转换代码

    根据给定文件的信息,我们可以总结出以下关于C#中十六进制与字符串、字节数组之间转换的相关知识点: ### C#中十六进制与字符串、字节数组之间的转换 #### 一、概述 在计算机编程中,经常需要进行不同数据格式...

    java String 与各种进制字符之间的转换

    - `Integer.toHexString()`和`Integer.parseInt(hexStr, 16)`是十六进制字符串与整数之间转换的常用方法。 4. **字符编码与解码**: Java中的`Character`类提供了处理单个字符的方法。例如,可以使用`Character....

    java byte数组与int,long,short,byte的转换实现方法

    本文将详细介绍如何在Java中将`byte`数组与其他基本数据类型(如`int`、`long`、`short`、`byte`)之间进行转换。 首先,我们来看`byte`到`int`的转换。Java中的`byte`类型是8位的,取值范围是-128到127。如果要将...

    字符串与字节数组之间的转换

    在计算机编程领域,数据的转换是一项非常重要的工作,尤其是在处理网络通信、文件读写等场景时。本文将详细介绍如何在.NET框架下实现字符串与字节数组之间的转换,特别是字符串到16进制数组的转换以及反过来的转换...

Global site tag (gtag.js) - Google Analytics