总结一下与字节数组相关的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});
}
相关推荐
在IT领域,尤其是在Web开发中,图片文件与Base64编码字节数组字符串的转换是一种常见的操作。这种转换在不直接使用图片文件路径或URL,而是将图片数据嵌入到HTML、CSS或JavaScript中时非常有用。下面我们将详细探讨...
using System.IO; …… float f1 = 1.1F MemoryStream s = new MemoryStream(); BinaryWriter w=new BinaryWriter(s );
本文将详细介绍如何在C#中实现图像与字节数组之间的相互转换,并提供具体的代码示例。 ### 一、为什么需要进行图像与字节数组的转换 在很多情况下,我们都需要将图像转换为字节数组。例如: - **网络传输**:在...
在每次循环中,可以通过赋值操作来改变数组中的元素,从而模拟IO点的通断状态。例如,`Array[i][j] := TRUE;`会将数组的第i行第j列的元素设为真,表示对应的IO点被激活。 在全局DB(Data Block)中,我们需要创建两...
本文将详细探讨如何在Java、Python和C#这三种常用编程语言中实现图像(Image)与字节数组(byte[])之间的相互转换。 **Java中的转换** 1. **Image转byte[]** 在Java中,我们可以使用`FileInputStream`读取图片...
在这个场景下,我们可以利用多种方法来实现在VB程序间传递数值和字节数组。 1. **管道通信(Pipe Communication)** 管道是一种低级通信机制,它允许进程间的数据传输。在VB中,可以使用`MSWinsock`控件或`System.IO...
这个过程涉及到文件I/O操作,主要包括文件输入流(FileInputStream)和字节数组输出流(ByteArrayOutputStream)。下面我们将详细讲解如何在Java中实现这个功能,并给出实例。 1. **使用FileInputStream读取文件** ...
在C#中,我们可以使用System.IO.Compression命名空间下的GZipStream和DeflateStream类来实现字节数组的压缩和解压缩。GZipStream是基于GZIP格式的,而DeflateStream则使用DEFLATE算法,这是一种无损数据压缩算法,也...
最近在使用结构体与字节数组转化来实现socket间数据传输。现在开始整理一下。对于Marshal可以查阅msdn,关于字节数组与结构体转代码如下: using System; using System.Collections.Generic; using System.Linq; ...
//从输入流中获取数据并以字节数组返回public class StreamTool { /** * 从输入流获取数据 * @param inputStream * @return * @throws Exception */ public static byte[] readInputStream(InputStream ...
与ByteArrayInputStream相对应,ByteArrayOutputStream是OutputStream的子类,它允许我们将数据写入一个字节数组。当我们需要将数据写入内存中而不是文件或其他外部设备时,它是非常有用的。使用...
3. **处理字节数组**:读取到的字节数组就是图片的二进制表示,可以根据需要进行传输或存储。 4. **关闭流**:在完成操作后,记得关闭输入流以释放系统资源。 将字节流转化为图片则相反: 1. **创建输出流**:使用...
在C#中,`System.IO.Ports`命名空间提供了`SerialPort`类,用于设置和操作串口。初始化`SerialPort`时,需要指定端口号、波特率和其他参数,例如: ```csharp using System.IO.Ports; SerialPort serialPort = new...
这个过程涉及到两个主要步骤:读取图片文件到字节数组,然后将字节数组写入TXT文件。 1. **读取图片文件到字节数组**: 使用C#的`File.ReadAllBytes()`方法可以从磁盘上的文件读取所有字节到一个字节数组。例如,...
当我们将图像文件读入内存时,可以将其转换为字节数组,这样就可以方便地进行各种操作,包括在网络上传输或在内存中处理。 在Gtk+中,图像通常由`GdkPixbuf`对象表示。`GdkPixbuf`可以加载和显示多种图像格式,包括...
5. **字节数组操作**:字节数组是存储和传输数据的常用工具。在实验中,首先读取整个文件到一个字节数组`bytes`中,然后通过`Backward`方法倒序数组内容,最后将倒序后的字节数组写回文件。 6. **数组倒序**:`...
创建FileOutputStream对象后,可以调用write()方法将数据写入文件,write()方法接受一个字节值或者字节数组作为参数。 下面是一个简单的Java IO操作示例,展示如何使用InputStream和FileOutputStream进行文件的复制...
File 类、RandomAccessFile 类、字节流(文件字节流、缓冲字节流、基本数据类型字节流、打印流、对象序列化流、字节数组流)、字符流(缓冲字符流、文件字符流、转换流、格式化输出流、字符数组流) 这份代码源码...
十、数据流与字节数组流 数据流是一种特殊的流类型,用于存取 Java 原始数据类型,如 long、boolean 等。数据流是字节流,提供了可以存取 Java 原始数据类型的能力。常见的数据流类型有 DataInputStream 和 ...