void DataDeal(char* data, int size)
{
int32_t index = 0;
int32_t start = 0;
int32_t end = 0;
for(;index <= size;)
{
if (!start)
{
if (data[index++] == 0x00
&& data[index++] == 0x00
&& data[index++] == 0x00
&& data[index++] == 0x01)
{
start = index;
}
}
if (!end)
{
if (data[index++] == 0x00
&& data[index++] == 0x00
&& data[index++] == 0x00
&& data[index++] == 0x01)
{
end = index -4 ;
}
}
if (start && end)
{
int32_t size = end-start;
char* pp = (char*)&size;
memcpy(data+start-1, pp, 1);
memcpy(data+start-2, pp+1, 1);
memcpy(data+start-3, pp+2, 1);
memcpy(data+start-4, pp+3, 1);
start = end+4;
end = 0;
}
}
end = size;
int32_t size_s = end-start;
if (size_s)
{
char* pp = (char*)&size_s;
memcpy(data+start-1, pp, 1);
memcpy(data+start-2, pp+1, 1);
memcpy(data+start-3, pp+2, 1);
memcpy(data+start-4, pp+3, 1);
}
return;
}
void main()
{
char data[100] = {0x00, 0x00, 0x00, 0x01, 0x63, 0x00, 0x21, 0x00, 0x00, 0x00, 0x01, 0x63, 0x21, 0x63, 0x21, 0x00, 0x00, 0x00, 0x01, 0x63, 0x21,0x63, 0x21,0x63, 0x21,0x63, 0x21,0x00, 0x00, 0x00, 0x01,0x63, 0x21,0x63, 0x21,0x63, 0x21,0x63, 0x21,0x63, 0x21,0x63, 0x21,0x00, 0x00, 0x00, 0x01, 0x63, 0x21,0x63, 0x21,0x63, 0x21,0x63, 0x21, 0x63, 0x21,0x63, 0x21,0x63, 0x21, 0x00, 0x00, 0x00, 0x01};
DataDeal(data, 65);
}
DataDeal函数是查找替换掉0x00, 0x00, 0x00, 0x01, 并将其数值修改为两个0x00, 0x00, 0x00, 0x01之间数据长度,并且按照打段顺序排列;
就目前来看 这个函数怎么样优化好些呢?
该回答引用ChatGPT-3.5,仅供参考,不保证完全正确
这里有几个可以优化的地方:
避免重复读取相同的值:在原始代码中,每次检查起始标记和结束标记时,都是分别读取4个字节。可以将这些值缓存起来,避免重复读取。这样可以减少内存访问的开销。
使用指针操作代替数组下标:使用指针操作可以提高代码的可读性和执行效率。通过使用指针,可以避免对数组的重复索引操作。
使用位操作代替字节比较:由于标记值都是连续的字节,可以使用位操作来进行比较,而不是逐字节比较。这可以减少比较操作的次数。
减少内存拷贝次数:在原始代码中,对于每个匹配段,使用了多次内存拷贝操作。可以优化为一次内存拷贝操作,减少不必要的内存访问。
下面是对DataDeal函数进行优化的修改示例:
void DataDeal(char* data, int size)
{
int32_t* p_data = reinterpret_cast<int32_t*>(data);
int32_t* p_start = nullptr;
int32_t* p_end = nullptr;
int32_t* p_data_end = reinterpret_cast<int32_t*>(data + size);
while (p_data < p_data_end)
{
if (!p_start)
{
if (*p_data == 0x01000000)
{
p_start = p_data;
p_data++;
}
}
if (!p_end)
{
if (*p_data == 0x01000000)
{
p_end = p_data - 1;
}
}
if (p_start && p_end)
{
int32_t segment_size = static_cast<int32_t>(p_end - p_start) * sizeof(int32_t);
*p_start = segment_size;
// Shift the data by 3 bytes to the left
memmove(p_start - 3, p_start, segment_size + sizeof(int32_t));
p_start = nullptr;
p_end = nullptr;
}
p_data++;
}
int32_t* p_start_last_segment = p_start;
if (p_start_last_segment)
{
int32_t segment_size = static_cast<int32_t>(p_data_end - p_start_last_segment) * sizeof(int32_t);
*p_start_last_segment = segment_size;
// Shift the data by 3 bytes to the left
memmove(p_start_last_segment - 3, p_start_last_segment, segment_size + sizeof(int32_t));
}
}
这个优化版本避免了重复读取数据,使用指针操作代替了数组下标操作,并使用位操作进行比较。另外,优化后的版本在处理最后一个段时也进行了相应的修改。
请注意,优化的效果可能因具体情况而异,最好在实际测试和比较之后再决定是否采纳这些修改。