「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」
操作字节数组的常用方法
字节数组是什么,就是byte[]这种类型,一般的安卓开发者对字节接触的比较少,操作字节并不像操作字符串那么方便。本篇文章的目的,是为了记录常用操作字节的方法。
System.arrayCopy
官方是这样描述的
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
代码解释:
Object src : 原数组
int srcPos : 从元数据的起始位置开始
Object dest : 目标数组
int destPos : 目标数组的开始起始位置
int length : 要copy的数组的长度
这个方法在操作字节数组中经常用到。用上面的方法举几个例子。
- 克隆新的数组
// 新数组
byte[] srcBytes = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// 目标数组
byte[] destBytes = new byte[5];
// 截取
System.arraycopy(srcBytes, 1, destBytes, 0, 5);
Log.d("===","Arrays.toString(destBytes):"+Arrays.toString(destBytes));
// 输出:[2, 3, 4, 5, 6]
- 比较两个数组是否相同
/**
* 两个byte[]是否相同
*
* @param data1
* @param data2
* @return
*/
public static boolean arrayEquals(byte[] data1, byte[] data2) {
return Arrays.equals(data1, data2);
}
- 截取数组,像截取String一样
/**
* 截取byte[]
*
* @param data
* @param position
* @param length
* @return
*/
public static byte[] subArray(byte[] data, int position, int length) {
byte[] temp = new byte[length];
System.arraycopy(data, position, temp, 0, length);
return temp;
}
- 合并两个数组
/**
* 拼接byte[] 和 byte[]
*
* @param bytes1
* @param bytes2
* @return
*/
public static byte[] byteMerger(byte[] bytes1, byte[] bytes2) {
byte[] bytes3 = new byte[bytes1.length + bytes2.length];
System.arraycopy(bytes1, 0, bytes3, 0, bytes1.length);
System.arraycopy(bytes2, 0, bytes3, bytes1.length, bytes2.length);
return bytes3;
}
可变数组
在创建数组的时候,必须要指定数组的长度,但有时候不确定数组有多少长,所以这种场景下就不方便去处理,有没有像List这样的类,或者像操作字符串的StringBuffer这种方法呢?
使用 ByteArrayOutputStream
new ByteArrayOutputStream()之后,就可以方便的进行写入了。
byte[] srcBytes = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
try {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
stream.write(srcBytes);
Log.d("===", "stream.toByteArray():" + Arrays.toString(stream.toByteArray()));
} catch (IOException e) {
e.printStackTrace();
}
// 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
如果再高级一些,也可以自己设计可边长度的字节数组,大家可以参考这篇文章