`
阅读更多

总结一下与字节数组相关的IO操作。

关于 把十六进制的位串转化为byte数组,请参阅 http://hw1287789687.iteye.com/blog/1882644

 

(1)从InputStream 读取字节数组

方式一:

/***
	 * Has been tested
	 * 
	 * @param in
	 * @return
	 * @throws IOException
	 */
	public static byte[] readBytes3(InputStream in) throws IOException {
		BufferedInputStream bufin = new BufferedInputStream(in);
		int buffSize = BUFFSIZE_1024;
		ByteArrayOutputStream out = new ByteArrayOutputStream(buffSize);

		// System.out.println("Available bytes:" + in.available());

		byte[] temp = new byte[4096];
		int size = 0;
		while ((size = bufin.read(temp)) != -1) {
			out.write(temp, 0, size);
		}
		bufin.close();
		in.close();
		byte[] content = out.toByteArray();
		return content;
	}

 说明:先把inputstream的字节读到ByteArrayOutputStream中,读完之后再调用toByteArray() 转化为字节数组。

 

方式二:

/***
	 * Has been tested
	 * 
	 * @param in
	 * @return
	 * @throws IOException
	 */
	public static byte[] readBytes(InputStream in) throws IOException {
		byte[] temp = new byte[in.available()];
		byte[] result = new byte[0];
		int size = 0;
		while ((size = in.read(temp)) != -1) {
			byte[] readBytes = new byte[size];
			System.arraycopy(temp, 0, readBytes, 0, size);
			result = mergeArray(result, readBytes);
		}
		return result;
	}
/***
	 * 合并字节数组
	 * 
	 * @param a
	 * @return
	 */
	public static byte[] mergeArray(byte[]... a) {
		// 合并完之后数组的总长度
		int index = 0;
		int sum = 0;
		for (int i = 0; i < a.length; i++) {
			sum = sum + a[i].length;
		}
		byte[] result = new byte[sum];
		for (int i = 0; i < a.length; i++) {
			int lengthOne = a[i].length;
			if (lengthOne == 0) {
				continue;
			}
			// 拷贝数组
			System.arraycopy(a[i], 0, result, index, lengthOne);
			index = index + lengthOne;
		}
		return result;
	}

 

 

(2)把字节数组写入文件

/***
	 * write byte[] to file
	 * 
	 * @param bytes
	 * @param destFile
	 * @throws IOException
	 */
	public static void writeBytesToFile(byte[] bytes, File destFile)
			throws IOException {
		FileOutputStream out = new FileOutputStream(destFile);
		write2File(bytes, out);
	}
/***
	 * 
	 * @param bytes
	 * @param out
	 * @throws IOException
	 */
	public static void write2File(byte[] bytes, FileOutputStream out)
			throws IOException {
		out.write(bytes);
		out.close();
	}

 

 

(3)在已有字节数组基础上追加一个字节

/***
	 * append a byte.
	 * 
	 * @param a
	 * @param b
	 * @return
	 */
	public static byte[] appandByte(byte[] a, byte b) {
		int length = a.length;
		byte[] resultBytes = new byte[length + 1];
		System.arraycopy(a, 0, resultBytes, 0, length);
		resultBytes[length] = b;
		return resultBytes;
	}

 

(4)比较两个字节数组是否相同

/***
	 * Compare two byte arrays whether are the same.
	 * 
	 * @param a
	 * @param b
	 * @return
	 */
	public static boolean arrayIsEqual(byte[] a, byte[] b) {
		if(a==null&&b==null){
			return true;
		}
		
		if (a != null && b != null) {
			if (a.length != b.length) {
				return false;
			} else {
				for (int i = 0; i < a.length; i++) {
					if (a[i] != b[i]) {
						return false;
					}
				}
			}
		}else {//one is null, the other is not null
			return false;
		}
		return true;
	}

 

(5)查找指定字节findTarget在指定字节数组source中的位置

/***
	 * 
	 * @param source
	 * @param findTarget
	 *            :key word
	 * @param pos
	 *            :where start from
	 * @return index
	 */
	public static int findBytes(byte[] source, byte[] findTarget, int pos) {
		int i, j, k = 0;
		i = pos;
		j = 0;
		while (i < source.length && j < findTarget.length) {
			if (source[i] == findTarget[j]) {
				++i;
				++j;
				if (j == findTarget.length) {
					k = k + 1;// k++
					break;
					// j = 0;
				}
			} else {
				i = i - j + 1;
				j = 0;
			}
		}
		return k == 0 ? -1 : i - j;
	}

 

 

测试代码:

 @Test
    public void test_arrayIsEqual2(){
    	System.out.println("test_filterFrontBytes");
		byte[] a = new byte[] { 1, 2, 3, 4 };
		byte[] b = new byte[] { 1, 2, 3 };
		System.out.println( arrayIsEqual(a, b));
}
@Test
	public void test_appandByte(){
		byte[]bytes=new byte[]{1,2,3};
		byte[]resultBytes=appandByte(bytes, (byte)32);
		arrayIsEqual(resultBytes, new byte[]{1, 2, 3, 32});
	}

 

0
0
分享到:
评论

相关推荐

    [C#]image与byte数组的转换

    本文将详细介绍如何在C#中实现图像与字节数组之间的相互转换,并提供具体的代码示例。 ### 一、为什么需要进行图像与字节数组的转换 在很多情况下,我们都需要将图像转换为字节数组。例如: - **网络传输**:在...

    在C#中将任意数值类型数据与字节数组相互转换的一个方法及源代码

    using System.IO; …… float f1 = 1.1F MemoryStream s = new MemoryStream(); BinaryWriter w=new BinaryWriter(s );

    image与字节数组byte的互转

    本文将详细探讨如何在Java、Python和C#这三种常用编程语言中实现图像(Image)与字节数组(byte[])之间的相互转换。 **Java中的转换** 1. **Image转byte[]** 在Java中,我们可以使用`FileInputStream`读取图片...

    TIA博途中通过AT指令和二维数组实现IO点位映射的具体方法示例.docx

    在每次循环中,可以通过赋值操作来改变数组中的元素,从而模拟IO点的通断状态。例如,`Array[i][j] := TRUE;`会将数组的第i行第j列的元素设为真,表示对应的IO点被激活。 在全局DB(Data Block)中,我们需要创建两...

    图片文件与Base64编码字节数组字符串互转

    在IT领域,尤其是在Web开发中,图片文件与Base64编码字节数组字符串的转换是一种常见的操作。这种转换在不直接使用图片文件路径或URL,而是将图片数据嵌入到HTML、CSS或JavaScript中时非常有用。下面我们将详细探讨...

    两个VB程序间互相通信 可以传送数值 也可以传送字节数组

    在这个场景下,我们可以利用多种方法来实现在VB程序间传递数值和字节数组。 1. **管道通信(Pipe Communication)** 管道是一种低级通信机制,它允许进程间的数据传输。在VB中,可以使用`MSWinsock`控件或`System.IO...

    Java 将文件转为字节数组知识总结及实例详解

    这个过程涉及到文件I/O操作,主要包括文件输入流(FileInputStream)和字节数组输出流(ByteArrayOutputStream)。下面我们将详细讲解如何在Java中实现这个功能,并给出实例。 1. **使用FileInputStream读取文件** ...

    用于C#字节数组的快速压缩实用程序

    在C#中,我们可以使用System.IO.Compression命名空间下的GZipStream和DeflateStream类来实现字节数组的压缩和解压缩。GZipStream是基于GZIP格式的,而DeflateStream则使用DEFLATE算法,这是一种无损数据压缩算法,也...

    C#中结构体和字节数组转换实现

    最近在使用结构体与字节数组转化来实现socket间数据传输。现在开始整理一下。对于Marshal可以查阅msdn,关于字节数组与结构体转代码如下: using System; using System.Collections.Generic; using System.Linq; ...

    java从输入流中获取数据并返回字节数组示例

    //从输入流中获取数据并以字节数组返回public class StreamTool { /** * 从输入流获取数据 * @param inputStream * @return * @throws Exception */ public static byte[] readInputStream(InputStream ...

    详解Java中ByteArray字节数组的输入输出流的用法

    与ByteArrayInputStream相对应,ByteArrayOutputStream是OutputStream的子类,它允许我们将数据写入一个字节数组。当我们需要将数据写入内存中而不是文件或其他外部设备时,它是非常有用的。使用...

    Java实现字节流与图片的转化Java源码

    3. **处理字节数组**:读取到的字节数组就是图片的二进制表示,可以根据需要进行传输或存储。 4. **关闭流**:在完成操作后,记得关闭输入流以释放系统资源。 将字节流转化为图片则相反: 1. **创建输出流**:使用...

    C# 串口通讯截取4位字节数据16进制转浮点型输出

    在C#中,`System.IO.Ports`命名空间提供了`SerialPort`类,用于设置和操作串口。初始化`SerialPort`时,需要指定端口号、波特率和其他参数,例如: ```csharp using System.IO.Ports; SerialPort serialPort = new...

    C# 将图片文件转换成字节流存储在TXT

    这个过程涉及到两个主要步骤:读取图片文件到字节数组,然后将字节数组写入TXT文件。 1. **读取图片文件到字节数组**: 使用C#的`File.ReadAllBytes()`方法可以从磁盘上的文件读取所有字节到一个字节数组。例如,...

    Python-ByteArrayToImage:Python Gtk+ 应用程序从字节数组中恢复图像

    当我们将图像文件读入内存时,可以将其转换为字节数组,这样就可以方便地进行各种操作,包括在网络上传输或在内存中处理。 在Gtk+中,图像通常由`GdkPixbuf`对象表示。`GdkPixbuf`可以加载和显示多种图像格式,包括...

    文件字节倒写实验 课程设计

    5. **字节数组操作**:字节数组是存储和传输数据的常用工具。在实验中,首先读取整个文件到一个字节数组`bytes`中,然后通过`Backward`方法倒序数组内容,最后将倒序后的字节数组写回文件。 6. **数组倒序**:`...

    javaIO操作简单例子

    创建FileOutputStream对象后,可以调用write()方法将数据写入文件,write()方法接受一个字节值或者字节数组作为参数。 下面是一个简单的Java IO操作示例,展示如何使用InputStream和FileOutputStream进行文件的复制...

    Java的IO流讲解代码: File 类、RandomAccessFile 类、字节流(文件字节流、缓冲字节流、基本数据类型

    File 类、RandomAccessFile 类、字节流(文件字节流、缓冲字节流、基本数据类型字节流、打印流、对象序列化流、字节数组流)、字符流(缓冲字符流、文件字符流、转换流、格式化输出流、字符数组流) 这份代码源码...

    java io 流,文件读取操作

    十、数据流与字节数组流 数据流是一种特殊的流类型,用于存取 Java 原始数据类型,如 long、boolean 等。数据流是字节流,提供了可以存取 Java 原始数据类型的能力。常见的数据流类型有 DataInputStream 和 ...

Global site tag (gtag.js) - Google Analytics