该代码什么情况会进去catch
try
{
if (fileAllInfo_.erase.empty())
{
throw std::invalid_argument("erase para empty.");
}
printf("func[%s][%d]:fileAllInfo_.erase.size()=%lu \n", __FUNCTION__, __LINE__, fileAllInfo_.erase.size());
_parseFilePath(filePath_, destFolder);
std::ofstream outputFile(destFolder + ".pcf", std::ios::out | std::ios::trunc);
if (!outputFile.is_open())
{
outputFile.close();
throw std::runtime_error("outputFile failed to open.");
}
/* write pcf file header */
_writePcfField(outputFile, PCF_FLAG); ///< PCF标记 U32
pcf_header_len += PCF_FIELD_LEN;
_writePcfField(outputFile, PCF_VERSION); ///< PCF版本 U32
pcf_header_len += PCF_FIELD_LEN;
_writePcfField(outputFile, 0); ///< block数目 U32,初始为0读完重写
pcf_header_len += PCF_FIELD_LEN;
_writePcfField(outputFile, 0); ///< alldata CRC U32,初始为0读完重写
pcf_header_len += PCF_FIELD_LEN;
/* write pcf 自定义数据 */
std::uint32_t data_format = std::stoul(getFileAttribute().data_format_identifier, nullptr, 16);
_writePcfField(outputFile, data_format); ///< 数据格式:是否压缩 U32
pcf_header_len += PCF_FIELD_LEN;
printf("func[%s][%d]:data_format=0x%x \n", __FUNCTION__, __LINE__, data_format);
//逻辑段信息
std::uint32_t erase_addr = 0;
std::uint32_t erase_len = 0;
_writePcfField(outputFile, fileAllInfo_.erase.size());
pcf_header_len += PCF_FIELD_LEN;
for (auto& item : fileAllInfo_.erase)
{
erase_addr = std::stoul(item.start_address, nullptr, 16);
erase_len = std::stoul(item.length, nullptr, 16);
printf("func[%s][%d]:erase_addr=%#x, erase_len=%#x \n", __FUNCTION__, __LINE__, erase_addr, erase_len);
_writePcfField(outputFile, erase_addr); ///< 逻辑段擦除地址 U32
pcf_header_len += PCF_FIELD_LEN;
_writePcfField(outputFile, erase_len); ///< 逻辑段擦除长度 U32
pcf_header_len += PCF_FIELD_LEN;
erase_addr = 0;
erase_len = 0;
}
/* write pcf 自定义数据 填充数据 */
std::uint32_t paddingLen = PCF_HEADER_SIZE - pcf_header_len;
std::uint8_t* pPaddingData = new std::uint8_t[paddingLen]();
outputFile.write(reinterpret_cast<char*>(pPaddingData), paddingLen);
delete[] pPaddingData;
std::ifstream inputFile(filePath_, std::ios::in | std::ios::binary);
if (!inputFile.is_open())
{
inputFile.close();
outputFile.close();
throw std::runtime_error("inputFile failed to open.");
}
/* 获取cbf数据总长度 */
uint64_t total_data_size = fileStructureInfo_.at(FILE_DATA_LENGTH);
printf("func[%s][%d]:total_data_size=0x%lx \n", __FUNCTION__, __LINE__, total_data_size);
if (0 == total_data_size)
{
printf("func[%s][%d]:total_data_size=0x%lx \n", __FUNCTION__, __LINE__, total_data_size);
inputFile.close();
outputFile.close();
throw std::runtime_error("error:total_data_size is 0");
}
/* 定位到cbf数据位置 */
uint64_t positionToRead = fileStructureInfo_[FILE_DATA_POSITION];
printf("func[%s][%d]:positionToRead=0x%lx \n", __FUNCTION__, __LINE__, positionToRead);
inputFile.seekg(positionToRead, std::ios::beg);
std::uint8_t block_addr_buf[PCF_FIELD_LEN] = {0};
std::uint8_t block_len_buf[PCF_FIELD_LEN] = {0};
std::uint8_t block_crc_buf[PCF_FIELD_LEN] = {0};
std::uint32_t block_addr = 0;
std::uint32_t block_len = 0;
unsigned short block_crc = 0xFFFF;
std::uint32_t block_num = 0;
unsigned short all_data_crc = 0xFFFF; ///< crc_ccitt初始值
std::uint32_t read_bufsize = 0;//每次需要读取大小
std::uint32_t has_read_size = 0;//每个block已经读取大小
std::uint32_t pcf_offset = 0;//记录pcf文件偏移
std::uint32_t cbf_block_crc = 0; //cbf配置字节,vdi存4字节
while (true)
{
inputFile.read(reinterpret_cast<char*>(block_addr_buf), PCF_FIELD_LEN);
if (inputFile.eof())
{
break;
}
block_addr = _convert_arr_to_u32(block_addr_buf);
printf("func[%s][%d]:block_addr=%#x \n", __FUNCTION__, __LINE__, block_addr);
inputFile.read(reinterpret_cast<char*>(block_len_buf), PCF_FIELD_LEN);
if (inputFile.eof())
{
break;
}
block_len = _convert_arr_to_u32(block_len_buf);
printf("func[%s][%d]:block_len=%#x \n", __FUNCTION__, __LINE__, block_len);
_writePcfField(outputFile, block_addr);
pcf_offset += PCF_FIELD_LEN;
_writePcfField(outputFile, block_len);
pcf_offset += PCF_FIELD_LEN;
//如果block大小超过文件大小为异常
if (block_len > total_data_size)
{
bRet = false;
break;
}
_writePcfField(outputFile, 0); //先默认block crc为0
pcf_offset += PCF_FIELD_LEN;
//按设置大小循环读取block
read_bufsize = block_len < HEAP_MEMORY_MAX_BUFF ? block_len : HEAP_MEMORY_MAX_BUFF;
printf("func[%s][%d]:read_bufsize=%#x \n", __FUNCTION__, __LINE__, read_bufsize);
readBuff = new char[read_bufsize]();
while (has_read_size < block_len)
{
std::uint32_t onceSize = (block_len - has_read_size) < read_bufsize ? (block_len - has_read_size) : read_bufsize;
inputFile.read(readBuff, onceSize);
if (inputFile.eof())
{
delete[] readBuff;
break;
}
outputFile.write(readBuff, onceSize);
pcf_offset += onceSize;
has_read_size += onceSize;
//block_crc = CalcCRC(block_crc, onceSize, (unsigned char*)readBuff);
printf("func[%s][%d]:block_crc=%#x \n", __FUNCTION__, __LINE__, block_crc);
//all_data_crc = CalcCRC(all_data_crc, onceSize, (unsigned char*)readBuff);
printf("func[%s][%d]:all_data_crc=%#x \n", __FUNCTION__, __LINE__, all_data_crc);
tools_time_delay(10);
}
inputFile.read(reinterpret_cast<char*>(block_crc_buf), CRC_16_LEN);
if (inputFile.eof())
{
delete[] readBuff;
break;
}
cbf_block_crc = _convert_arr_to_u32(block_crc_buf);
printf("func[%s][%d]:cfg cbf_block_crc=%#x \n", __FUNCTION__, __LINE__, cbf_block_crc);
outputFile.seekp(PCF_HEADER_SIZE + pcf_offset - block_len - PCF_FIELD_LEN, std::ios::beg);
_writePcfField(outputFile, block_crc);
//写完后需要将文件指针移动到末尾,待下一个block输入
outputFile.seekp(0, std::ios::end);
if (nullptr != readBuff)
{
delete[] readBuff;
}
memset(block_addr_buf, 0, sizeof(block_addr_buf));
block_addr = 0;
memset(block_len_buf, 0, sizeof(block_len_buf));
block_len = 0;
memset(block_crc_buf, 0, sizeof(block_crc_buf));
block_crc = 0xFFFF;
has_read_size = 0;
block_num++;
}
//最后写入block num
printf("func[%s][%d]:block_num=%u \n", __FUNCTION__, __LINE__, block_num);
outputFile.seekp(PCF_FIELD_LEN + PCF_FIELD_LEN, std::ios::beg);
_writePcfField(outputFile, block_num);
//最后写入all_data_crc
printf("func[%s][%d]:all_data_crc=%#x \n", __FUNCTION__, __LINE__, all_data_crc);
_writePcfField(outputFile, all_data_crc);
inputFile.close();
outputFile.close();
}
catch (std::exception& e)
{
std::cout << e.what() << std::endl;
if (nullptr != readBuff)
{
delete[] readBuff;
}
return false;
}