
Сообщение от
Alex_K
Там все - и межсекторные промежутки, и маркеры, и заголовки, и данные, ну и соответственно CRC.
Чтобы далеко не ходить - возьмём заголовок первого сектора:
Код:
A1 A1 A1 FE 00 00 01 02 CA 6F
Запустим эти байты в стандартный алгоритм CRC-16:
Код:
printf("Write:");
crc = 0xFFFF;
crc = crc16(crc, 0xA1);
crc = crc16(crc, 0xA1);
crc = crc16(crc, 0xA1);
crc = crc16(crc, 0xFE);
crc = crc16(crc, 0x00);
crc = crc16(crc, 0x00);
crc = crc16(crc, 0x01);
crc = crc16(crc, 0x02);
tmp = crc;
printf("\nCRC: %04X", tmp);
printf("\n\nRead:");
crc = 0xFFFF;
crc = crc16(crc, 0xA1);
crc = crc16(crc, 0xA1);
crc = crc16(crc, 0xA1);
crc = crc16(crc, 0xFE);
crc = crc16(crc, 0x00);
crc = crc16(crc, 0x00);
crc = crc16(crc, 0x01);
crc = crc16(crc, 0x02);
crc = crc16(crc, 0xCA);
crc = crc16(crc, 0x6F);
printf("\nTMP: %04X", crc);
if ( crc == 0x0000 ) printf(" CRC OK");
Результат запуска:
Код:
Write:
A1 ( FFFF, 443B )
A1 ( 443B, 968B )
A1 ( 968B, CDB4 )
FE ( CDB4, B230 )
00 ( B230, B799 )
00 ( B799, 4E3C )
01 ( 4E3C, 852B )
02 ( 852B, CA6F )
CRC: CA6F
Read:
A1 ( FFFF, 443B )
A1 ( 443B, 968B )
A1 ( 968B, CDB4 )
FE ( CDB4, B230 )
00 ( B230, B799 )
00 ( B799, 4E3C )
01 ( 4E3C, 852B )
02 ( 852B, CA6F )
CA ( CA6F, 6F00 )
6F ( 6F00, 0000 )
TMP: 0000 CRC OK
ВП1-128 "внутри себя" использует инверсный вариант CRC-16, но перед записью на диск инвертирует CRC, поэтому на диск пишется в точности то же, что генерит стандартный алгоритм CRC-16:
Код:
CRC-16
width=16 poly=0x1021 init=0xFFFF refin=false refout=false
xorout=0x0000 check=0x29B1