Objective-C转C#代码疑问:固件数据块截取逻辑是否正确?
固件数据块处理代码Objective-C转C#的数组长度问题分析
原Objective-C代码逻辑
原代码核心是根据不同条件截取固件数据块,逻辑如下:
NSData *blockData; if(valid) { if(sendingLast) { blockData = rawFirmwareData; } else { int startingPos = (currSensor.firmwareBlockIterator * (ourCurrentSensor.firmwareBlockSize - headerSize)); blockData = [rawFirmwareData subdataWithRange:NSMakeRange(startingPos, rawFirmwareData.length - startingPos)]; } } else { blockData = [rawFirmwareData subdataWithRange:NSMakeRange((currSensor.firmwareBlockIterator * (currSensor.firmwareBlockSize - headerSize)), (currSensor.firmwareBlockSize - headerSize))]; }
拆解关键逻辑:
- 当
valid为true时:- 若
sendingLast为true,直接复用完整的rawFirmwareData - 若
sendingLast为false,截取从startingPos到数据末尾的所有剩余内容(长度为rawFirmwareData.length - startingPos)
- 若
- 当
valid为false时,固定截取长度为currSensor.firmwareBlockSize - headerSize的数据块
你的C#代码的问题
你在valid为true且sendingLast为false的分支里,错误地将数组长度设置为currSensor.firmwareBlockSize - headerSize,这和原Objective-C逻辑不符——原逻辑这里是取剩余全部数据,而非固定大小的块。其他分支(valid为false、valid为true且sendingLast为true)的数组处理是符合原逻辑的。
修正后的C#代码
byte[] blockData; if (valid) { if (sendingLast) { blockData = rawFirmwareData; } else { int blockSizeMinusHeader = currSensor.firmwareBlockSize - headerSize; int startingPos = currSensor.firmwareBlockIterator * blockSizeMinusHeader; // 计算剩余数据长度,而非固定块大小 int remainingLength = rawFirmwareData.Length - startingPos; blockData = new byte[remainingLength]; Array.Copy(rawFirmwareData, startingPos, blockData, 0, remainingLength); } } else { int blockSizeMinusHeader = currSensor.firmwareBlockSize - headerSize; int startingPos = currSensor.firmwareBlockIterator * blockSizeMinusHeader; blockData = new byte[blockSizeMinusHeader]; Array.Copy(rawFirmwareData, startingPos, blockData, 0, blockSizeMinusHeader); }
内容的提问来源于stack exchange,提问作者appym243
相关产品推荐
相关产品推荐

