先決條件:如何快速找到匹配模式用C
- 我不能使用malloc。
- 錯誤發生在兩個字節內,意味着我可以逐字搜索。
- 我的CPU是32位ARM11,在此期間沒有操作系統。
- 前兩個字節是重要的,如果前兩個字節是0x00,這意味着所有其餘的字節應該是0x00。
- 如果前兩個字節是0xFF,則剩餘的字節應該是0xFF。
- 如果前兩個字節不是0x0000和0xFFFF,我只是報告一個錯誤,不需要比較其餘的。
我讀256Kbyte的數據塊,這應該只有兩種狀態:
- 所有0xFF的
- 全部爲0x00
然而,一些數據可能會更改爲一個不可預測值。我需要找出他們。我可以用一個字節搜索這一個字節,但似乎太慢了,所以我決定用二分法的方式來做到這一點 - 它看起來像:
- 鴻溝讀出的數據爲相等的一半,然後進行比較。
- 如果兩者都不等於全0或F,則表示數據在兩端都已損壞,我只需要找到最早的一個,所以我應該放棄第二部分,然後再分開第一部分。如果只有一方有問題,就放棄好的問題,重點放在問題上.e
- loop以上的想法
- 似乎在17點之後,應該找到點。
如何將代碼寫入循環?我是否需要17種不同尺寸的參考靜態數據並使用memcmp
?
我當前的代碼看起來像:
unsigned char gReferData1[2] = {0xFF, 0xFF};
unsigned char gReferData2[2] = {0x00, 0x00};
int main(void)
{
int i = 0, result1 = 0, result2 =0;
read_somewhere(readBuff, sizeof(readBuff)); //read out data
//first test first two bytes
result1 = memcmp(gReferData1, readBuff, 2); //test if 0xFFFF
result2 = memcmp(gReferData2, readBuff, 2); //test if 0x0000
if(result1 == 0)
{
// means all rest data should be 0xFF
for(i=2; i<(0x40000/2); i++)
{
result1 = memcmp(gReferData1, readBuff + offet, 2); //test if 0xFFFF
if(result1 != 0)
{
//means find
// do error handle
}
offset+=2;
}
}
else if(result2 == 0)
{
// means all rest data should be 0x00
for(i=2; i<(0x40000/2); i++)
{
result2 = memcmp(gReferData2, readBuff + offet, 2); //test if 0x0000
if(result2 != 0)
{
//means find
// do error handle
}
offset+=2;
}
}
else
{
//just error
// do error handle
}
return 0;
}
您提出的解決方案讀取所有數據,所以我不知道它會如何更快。沒有辦法繞過它,如果你想找到一個錯誤的字節,你將不得不閱讀它。 – Fredrik
「我可以一個字節搜索一個字節,但似乎很慢。」你有沒有測量它有多慢? – 2016-10-22 13:13:26