/* (272,190)符合の訂正プログラム 1999-03-28 Hiroki Mori このプログラムでは82ビットのシンドロームレジスタを24ビット・28ビット・ 30ビットに分割して処理しています。 */ unsigned long r0, r1, r2; unsigned char vbipacket[] = { 0x55, 0x55, 0xa7, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xd3, 0x44, 0x60, 0xee, 0x1f, 0x6f, 0x52, 0xb6, 0xc6, 0xa3}; void shift82(int bit) { unsigned long next; next = ((r2 >> 29) & 1); if(next) { r0 ^= 0x00a20208; r1 ^= 0x08808a00; r2 ^= 0x01846008; } r0 <<= 1; r1 <<= 1; r1 |= ((r0 >> 24) & 1); r2 <<= 1; r2 |= ((r1 >> 28) & 1); r0 |= (next ^ bit); } int getbit(int bit) { if(bit >= 52) return((r2 >> (bit - 52)) & 1); else if(bit >= 24) return((r1 >> (bit - 24)) & 1); else return((r0 >> bit) & 1); } int majority(int border) { int a[17], sum, i; a[0] = getbit(71) ^ getbit(76); a[1] = getbit(17); a[2] = getbit(5) ^ getbit(23); a[3] = getbit(21) ^ getbit(27) ^ getbit(45); a[4] = getbit(3) ^ getbit(25) ^ getbit(31) ^ getbit(49); a[5] = getbit(16) ^ getbit(20) ^ getbit(42) ^ getbit(48) ^ getbit(66); a[6] = getbit(35) ^ getbit(52) ^ getbit(56) ^ getbit(78); a[7] = getbit(8) ^ getbit(44) ^ getbit(61) ^ getbit(65); a[8] = getbit(2) ^ getbit(11) ^ getbit(47) ^ getbit(64) ^ getbit(68); a[9] = getbit(10) ^ getbit(13) ^ getbit(22) ^ getbit(58) ^ getbit(75) ^ getbit(79); a[10] = getbit(1) ^ getbit(12) ^ getbit(15) ^ getbit(24) ^ getbit(60) ^ getbit(77) ^ getbit(81); a[11] = getbit(30) ^ getbit(32) ^ getbit(43) ^ getbit(46) ^ getbit(55); a[12] = getbit(6) ^ getbit(37) ^ getbit(39) ^ getbit(50) ^ getbit(53) ^ getbit(62); a[13] = getbit(0) ^ getbit(7) ^ getbit(38) ^ getbit(40) ^ getbit(51) ^ getbit(54) ^ getbit(63); a[14] = getbit(18) ^ getbit(19) ^ getbit(26) ^ getbit(57) ^ getbit(59) ^ getbit(70) ^ getbit(73); a[15] = getbit(9) ^ getbit(28) ^ getbit(29) ^ getbit(36) ^ getbit(67) ^ getbit(69) ^ getbit(80); a[16] = getbit(4) ^ getbit(14) ^ getbit(33) ^ getbit(34) ^ getbit(41) ^ getbit(41) ^ getbit(72) ^ getbit(74); sum = 0; for(i = 0; i < 17; ++i) sum += a[i]; if(sum >= border) return 1; else return 0; } int correct272(unsigned char *data) { int i, j, k; unsigned char *ptr, byte, cbyte; int majo, bit; r0 = r1 = r2 = 0; j = 0; ptr = data + 3; while(j < 272) { byte = *ptr++; for(i = 0; i < 8; ++i) { shift82((byte >> i) & 1); ++j; } } if((r0 & 0xffffff) == 0 && (r1 & 0xfffffff) == 0 && (r2 & 0x3fffffff) == 0) goto success; for(k = 14; k >= 9; --k) { shift82(0); j = 0; ptr = data + 3; while(j < 272) { byte = *ptr; cbyte = 0; for(i = 0; i < 8; ++i) { majo = majority(k); bit = ((byte >> i) & 1) ^ majo; shift82(majo); cbyte |= (bit << i); ++j; } *ptr = cbyte; ++ptr; } if((r0 & 0xffffff) == 0 && (r1 & 0xfffffff) == 0 && (r2 & 0x3fffffff) == 0) goto success; } return 0; success: return 1; } void main() { int i; // error data vbipacket[8] = 0x0f; vbipacket[10] = 0x0f; vbipacket[17] = 0x01; vbipacket[20] = 0x01; vbipacket[31] = 0x3f; printf("error data\n"); for(i = 0; i < 37; ++i) { printf("%02x ", vbipacket[i]); if((i + 1) % 16 == 0) printf("\n"); } printf("\n"); if(correct272(vbipacket) == 1) { printf("error correcting success\n"); for(i = 0; i < 37; ++i) { printf("%02x ", vbipacket[i]); if((i + 1) % 16 == 0) printf("\n"); } printf("\n"); } else { printf("error correcting fail\n"); } }