YModem在Android上的实现(二)
本节着重介绍CRC校验部分的内容
一:总思路
当前思路是把bin的内容和CRC合并成新的文件流
二:具体如何合并
crcArray = getByteArray();
byte[] allData = mergeArrays(bytesInputStream1, crcArray);
inputStream = new ByteArrayInputStream(allData);
三:详解二中参数
二中的合并是通过两个实参(均为byte数组)完成的,bin和CRC,三中介绍bin,四中捋好CRC
3.1:bin文件,先拿到文件流
下面的是YModem的构造方法,当升级的bin存在手机内部,实际路径在创建YModem对象时,作为实参传入并初始化
public YModem(Context context, String filePath,String fileNameString, String fileMd5String,YModemListener listener) {this.filePath = filePath;this.fileNameString = fileNameString;this.fileMd5String = fileMd5String;this.mContext = context;this.listener = listener;}
如果升级的bin文件放在APP的外部通过手机进行数据存储,则通过下面的方法拿到bin文件的文件流
InputStream inputStream1 = YModemUtil.getInputStream(mContext, filePath);
如果升级的bin文件放在APP的内部,则通过下面的方法拿到bin文件的文件流
InputStream inputStream1 = mContext.getAssets().open("radar-sensor-firmware_weifu_change_name.bin");
3.2:bin文件在拿到文件流后再转换成byte数组
//转换成byte数组
bytesInputStream1 = toByteArray(inputStream1);
四:CRC的流程
说明:
FileStreamThread.java中的变量fileByteSize和fileAndCrcSize两个在赋值时不是很准确,但是不影响升级,这两个变量并没有重要的实际使用价值
4.1具体CRC计算流程
【4.1.1】
CrcCalculate.calculateCrcArray()--->crcDebugArray
直接调用函数得到最原始的CRC数组,一个元素32字节
【4.1.2】
CrcCalculate.oneToFour(crcDebugArray[j])--->fourArray--->
将先前得到的CRC数组的元素,一个32位拆成8位转uint8,一个元素拆分成四个
【4.1.3】
forOriginalIntArray--->originalIntArray--->functionByteArray
得到uint8 8字节的整形数组后在转换为byte数组
4.2crc的byte数组最终和bin的byte数组合并
crcArray = getByteArray();
上面4.1最终得到的数组functionByteArray就是getByteArray()方法的返回值,
进而赋值给crcArray,
最终crcArray作为实参传入,得到bin+CRC合并后的byte数组
byte[] allData = mergeArrays(bytesInputStream1, crcArray)
五:CrcCalculate.calculateCrcArray函数步骤流程
参考V45的代码注释
六:CrcCalculate.oneToFour函数步骤流程
一个32位拆成8位转uint8