사전 조건 :신속 C
- 내가 malloc에 사용할 수 없습니다.
- 2 바이트 이내에 오류가 발생합니다. 즉 단어 단위로 단어를 검색 할 수 있습니다.
- 내 CPU는 32 비트 ARM11이며이 시간에는 OS가 없습니다.
- 처음 두 바이트가 중요합니다. 처음 두 바이트가 0x00이면 나머지 바이트는 모두 0x00이어야합니다.
- 처음 두 바이트가 0xFF이면 나머지 바이트는 모두 0xFF 여야합니다.
- 첫 번째 두 바이트가 모두 0x0000 및 0xFFFF가 아닌 경우 오류를보고하므로 나머지는 비교할 필요가 없습니다.
I은 단지 두 개의 상태가 있어야하는 256k byte에서 블록 데이터를 읽어
- 모든 0xFF를
- 을 0x00으로
그러나, 일부 데이터는 비 예측 값을 변경할 수있는 모든 . 나는 그들을 찾아야 해. 나는 1 바이트 그것을 하나의 바이트를 검색하지만 너무 느린, 그래서 나는 그것을 할 수 이분법 방법을 사용하기로 결정 수 있습니다 - 다음과 같습니다
- 분할 후 비교, 동일한 절반으로 데이터를 읽을 수 있습니다.
- 둘 다 모두 0 또는 F와 같지 않으면 데이터가 양면에서 손상되어 가장 빠른 것을 찾아야하므로 두 번째 부분을 포기하고 첫 번째 부분 만 다시 나누어야 함을 의미합니다. 단지 한쪽에만 문제가 있다면, 좋은 것을 포기하고 문제에 초점을 맞 춥니 다 .e
- 위의 루프
- 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
"한 바이트 씩 검색 할 수는 있지만 속도가 느린 것 같습니다." 얼마나 천천히 측정 했습니까? –