![]() |
<!DOCTYPE HTML> <HTML LANG="ja"> <HEAD> <META CHARSET="Shift_JIS"> <TITLE>今どきの 新・QR コード作成</TITLE> </HEAD> <BODY onLoad="shift_jis_init()" STYLE="background-color:#CCFFFF"> <CENTER> <BR> <B>今どきの 新・QR コード作成</B> <BR><BR> <SCRIPT TYPE="text/javascript"> <!-- MAX_VER = 40; MAX_MOD = 17 + MAX_VER * 4; document.writeln("<DIV STYLE='position:relative; width:", String(MAX_MOD * 2 + 40), "px; height:", String(MAX_MOD * 2 + 40), "px; background-color:white'>", "<DIV ID='vis' STYLE='position:relative'>"); for(i = 0; i < MAX_MOD; i++) { for(j = 0; j < MAX_MOD; j++) document.write("<SPAN ID='", i.toString(16), "_", j.toString(16), "' STYLE='position:absolute; left:", String(j * 2 + 20), "px; top:", String(i * 2 + 20), "px; width:2px; height:2px'>", "</SPAN>"); } document.writeln("</DIV></DIV>"); //--> </SCRIPT> <BR> <FORM> 誤り訂正レベル <SELECT NAME="level"> <OPTION SELECTED>L <OPTION>M <OPTION>Q <OPTION>H </SELECT> <BR><BR> データ<BR> <TEXTAREA NAME="data" ROWS=6 COLS=40></TEXTAREA> <BR><BR> <INPUT TYPE=BUTTON ID="cre" VALUE="作成" DISABLED onClick="QR_encoding()"> </FORM> <IFRAME ID="cvt" WIDTH=1 HEIGHT=1 FRAMEBORDER=0 SCROLLING=NO STYLE="visibility:hidden"></IFRAME> <DIV ID="msg" STYLE="visibility:hidden">処理中...</DIV> </CENTER> <SCRIPT TYPE="text/javascript"> <!-- // エンコード function QR_encoding() { data = document.forms[0].data.value; // データ if(!data.length) return; level = document.forms[0].level.selectedIndex; // 誤り訂正レベル document.getElementById("vis").style.visibility = "hidden"; document.getElementById("msg").style.visibility = "visible"; setTimeout("QR_encoding_body(); QR_encoding_end()", 0); } function QR_encoding_end() { if(data) // エラー以外 document.getElementById("vis").style.visibility = "visible"; document.getElementById("msg").style.visibility = "hidden"; } function QR_encoding_body() { var code1; var n1, n2; var b1, b2; var x, y; var i, j, k; // モード判定 var mode; // モード var data_len = 0; // 入力データ長 var f_num, f_alpha, f_kanji; f_num = f_alpha = f_kanji = 1; for(i = 0; i < data.length; i++) { var c = data.charAt(i); code1 = c.charCodeAt(0); if(code1 < 0x80 || code1 == 0xa5 || code1 == 0x203e) { // ASCII data_len++; f_kanji = 0; if(c < "0" || c > "9") { f_num = 0; if(c < "A" || c > "Z") { switch(c) { case " ": case "$": case "%": case "*": case "+": case "-": case ".": case "/": case ":": break; default: f_alpha = 0; } } } } else { if(code1 >= 0xff61 && code1 <= 0xff9f) { // 半角カナ data_len++; f_num = f_alpha = f_kanji = 0; } else { if(unicode.indexOf(c) == -1) { alert("エンコードできない文字があります!"); data = null; return; } data_len += 2; f_num = f_alpha = 0; } } } if (f_num) mode = 0; // 数字モード else if(f_alpha) mode = 1; // 英数字モード else if(f_kanji) mode = 3; // 漢字モード else mode = 2; // 8 ビット バイト モード var version; // 型番 var len_bits; // 文字数指示子ビット数 var data_cws; // データ コード語数 var max_chars; // 最大格納文字数 i_code = 0; reg = 0; reg_bits = 0; switch(mode) { case 0: // 数字モード // 型番決定 for(version = 1; version <= MAX_VER; version++) { if (version <= 9) len_bits = 10; else if(version <= 26) len_bits = 12; else len_bits = 14; n1 = (data_cws = get_data_cws(version, level)) * 8 - 4 - len_bits; max_chars = Math.floor(n1 / 10) * 3; n1 %= 10; if(n1 >= 4) { if(n1 >= 7) max_chars += 2; else max_chars++; } if(data_len <= max_chars) break; } if(version > MAX_VER) { alert("データが長すぎます!"); data = null; return; } // データ コード語作成 // モード指示子,文字数指示子 put_code(0x1, 4); put_code(data_len, len_bits); // データ for(i = 0; ; ) { if(i + 2 < data_len) { put_code(Number(data.substr(i, 3)), 10); if((i += 3) == data_len) break; } else { if (i + 1 < data_len) put_code(Number(data.substr(i, 2)), 7); else if(i < data_len) put_code(Number(data.charAt(i)), 4); break; } } break; case 1: // 英数字モード // 型番決定 for(version = 1; version <= MAX_VER; version++) { if (version <= 9) len_bits = 9; else if(version <= 26) len_bits = 11; else len_bits = 13; n1 = (data_cws = get_data_cws(version, level)) * 8 - 4 - len_bits; max_chars = Math.floor(n1 / 11) * 2; if(n1 % 11 >= 6) max_chars++; if(data_len <= max_chars) break; } if(version > MAX_VER) { alert("データが長すぎます!"); data = null; return; } // データ コード語作成 // モード指示子,文字数指示子 put_code(0x2, 4); put_code(data_len, len_bits); // データ for(i = 0; ; ) { if(i + 1 < data_len) { put_code(alpha_val(data.charAt(i)) * 45 + alpha_val(data.charAt(i + 1)), 11); if((i += 2) == data_len) break; } else { put_code(alpha_val(data.charAt(i)), 6); break; } } break; case 2: // 8 ビット バイト モード // 型番決定 for(version = 1; version <= MAX_VER; version++) { if (version <= 9) len_bits = 8; else len_bits = 16; max_chars = Math.floor(((data_cws = get_data_cws(version, level)) * 8 - 4 - len_bits) / 8); if(data_len <= max_chars) break; } if(version > MAX_VER) { alert("データが長すぎます!"); data = null; return; } // データ コード語作成 // モード指示子,文字数指示子 put_code(0x4, 4); put_code(data_len, len_bits); // データ for(i = 0; i < data.length; i++) { code1 = data.charCodeAt(i); if (code1 < 0x80) // ASCII put_code(code1, 8); else if(code1 == 0xa5) // 円記号 put_code(0x5c, 8); else if(code1 == 0x203e) // オーバライン put_code(0x7e, 8); else if(code1 >= 0xff61 && code1 <= 0xff9f) // 半角カナ put_code(code1 - 0xfec0, 8); else // 漢字 put_code(shift_jis(data.charAt(i)), 16); } break; case 3: // 漢字モード data_len = data.length; // 型番決定 for(version = 1; version <= MAX_VER; version++) { if (version <= 9) len_bits = 8; else if(version <= 26) len_bits = 10; else len_bits = 12; max_chars = Math.floor(((data_cws = get_data_cws(version, level)) * 8 - 4 - len_bits) / 13); if(data_len <= max_chars) break; } if(version > MAX_VER) { alert("データが長すぎます!"); data = null; return; } // データ コード語作成 // モード指示子,文字数指示子 put_code(0x8, 4); put_code(data_len, len_bits); // データ for(i = 0; i < data_len; i++) put_code(shift_jis_13(data.charAt(i)), 13); break; } // 終端パターン“0000”付加 if(i_code < data_cws - 1 || i_code < data_cws && !reg_bits) put_code(0x0, 4); // フラッシュ if(reg_bits) code[i_code++] = (reg << (8 - reg_bits)) & 0xff; // パディング for(; ; ) { if(i_code == data_cws) break; code[i_code++] = 0xec; if(i_code == data_cws) break; code[i_code++] = 0x11; } var n_blocks = rs_blocks[version - 1][level]; // RS ブロック数 var n_ec = ec_codewords[version - 1][level]; // 誤り訂正コード語数 var g_exp = g_exp_t[n_ec - 1]; // 誤り訂正コード α指数 // 誤り訂正コード作成 var i_data = 0; var i_ec = data_cws; n1 = Math.floor(data_cws / n_blocks); n2 = n_blocks - data_cws % n_blocks; for(i_block = 0; i_block < n_blocks; i_block++) { if(i_block == n2) n1++; var data_ec = code.slice(i_data, i_data + n1); data_ec.length = n1 + n_ec; for(i = 0; i < n_ec; i++) data_ec[n1 + i] = 0; for(i = 0; i < n1; i++) { if(data_ec[i]) { var exp1 = n_exp[data_ec[i]]; for(j = 0; j < n_ec; j++) data_ec[i + 1 + j] ^= exp_n[(g_exp[j] + exp1) % 255]; } } for(i = 0; i < n_ec; i++) code[i_ec + i] = data_ec[n1 + i]; i_data += n1; i_ec += n_ec; } var n_modules1 = 21 + (version - 1) * 4; // 1 辺のモジュール数 for(i = 0; i < n_modules1; i++) { for(j = 0; j < n_modules1; j++) module1[i][j] = 0; } // 位置検出パターン & 分離パターン & 形式情報位置予約(一部)& 固定暗モジュール for(i = 0; i < 8; i++) { for(j = 0; j < 9; j++) // 左上 module1[i][j] = finder_pat[i + 1][1 + j]; for(j = 0; j < 8; j++) // 右上 module1[i][n_modules1 - 8 + j] = finder_pat[i + 1][j]; for(j = 0; j < 9; j++) // 左下 module1[n_modules1 - 8 + i][j] = finder_pat[i][1 + j]; } // 形式情報位置予約 module1[8].splice(0, 9, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40); module1[8].splice(n_modules1 - 8, 8, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40); // 型番情報位置予約 if(version >= 7) { for(i = 11; i >= 9; i--) // 左下 module1[n_modules1 - i].splice(0, 6, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40); for(i = 0; i <= 5; i++) // 右上 module1[i].splice(n_modules1 - 11, 3, 0x40, 0x40, 0x40); } // タイミング パターン for(i = 8; i < n_modules1 - 9; i += 2) { module1[6][i ] = module1[i ][6] = 0x81; module1[6][i + 1] = module1[i + 1][6] = 0x80; } module1[6][i] = module1[i][6] = 0x81; // 位置合せパターン n1 = align_pos[version - 1].length; for(i = 0; i < n1; i++) { y = align_pos[version - 1][i]; for(j = 0; j < n1; j++) { if(i == 0 && j == 0 || i == 0 && j == n1 - 1 || i == n1 - 1 && j == 0) continue; x = align_pos[version - 1][j]; module1[y - 2].splice(x - 2, 5, 0x81, 0x81, 0x81, 0x81, 0x81); module1[y - 1].splice(x - 2, 5, 0x81, 0x80, 0x80, 0x80, 0x81); module1[y ].splice(x - 2, 5, 0x81, 0x80, 0x81, 0x80, 0x81); module1[y + 1].splice(x - 2, 5, 0x81, 0x80, 0x80, 0x80, 0x81); module1[y + 2].splice(x - 2, 5, 0x81, 0x81, 0x81, 0x81, 0x81); } } // シンボル キャラクタ配置 n1 = Math.floor(data_cws / n_blocks); n2 = n_blocks - data_cws % n_blocks; i_block = 0; i_code = 0; code1 = code[0]; b1 = 0x80; i = j = n_modules1 - 1; var dir = 0; // 走査方向 var l_r = 0; // 右/左 for(; ; ) { if(!module1[i][j]) { // 空き module1[i][j] = (code1 & b1) ? 1 : 0; if(!(b1 >>= 1)) { // 次のコード語 if(++i_block == n_blocks) { i_block = 0; i_code++; if(n1) { // データ コード if (i_code == n1) { // 短い方のデータ コードの長さ分終了 if(n2 == n_blocks) { // データ コードの長さがすべて等しい → 誤り訂正コードへ n1 = 0; i_code = 0; } else { // 余り分 i_block = n2; } } else if(i_code > n1) { // データ コード終了 → 誤り訂正コードへ n1 = 0; i_code = 0; } } else { // 誤り訂正コード if(i_code == n_ec) // 終了 break; } } if(n1) { // データ コード k = i_block * n1; if(i_block > n2) k += i_block - n2; } else { // 誤り訂正コード k = data_cws + i_block * n_ec; } code1 = code[k + i_code]; b1 = 0x80; } } if(l_r) { // 左 if(dir) { // 下方向 if(i < n_modules1 - 1) { i++; j++; } else { dir = 0; // 反転 if(--j == 6) j = 5; } } else { // 上方向 if(i) { i--; j++; } else { dir = 1; // 反転 if(--j == 6) j = 5; } } l_r = 0; } else { // 右 j--; l_r = 1; } } // マスク パターン決定 var mask; // マスク パターン var min_penalty = 0x7fffffff; // 最小失点 var m; for(m = 0x0; m <= 0x7; m++) { masking(n_modules1, m); // マスク // 失点計算 var penalty = 0; // 失点 // 同色の隣接モジュール for(i = 0; i < n_modules1; i++) { // 行 b1 = module2[i][0]; n1 = 1; // 列 b2 = module2[0][i]; n2 = 1; for(j = 1; j < n_modules1; j++) { // 行 if(module2[i][j] == b1) { n1++; } else { if(n1 >= 5) penalty += 3 + (n1 - 5); b1 = module2[i][j]; n1 = 1; } // 列 if(module2[j][i] == b2) { n2++; } else { if(n2 >= 5) penalty += 3 + (n2 - 5); b2 = module2[j][i]; n2 = 1; } } // 行 if(n1 >= 5) penalty += 3 + (n1 - 5); // 列 if(n2 >= 5) penalty += 3 + (n2 - 5); } // 2×2 のモジュール ブロック for(i = 0; i < n_modules1 - 1; i++) { for(j = 0; j < n_modules1 - 1; j++) { b1 = module2[i][j]; if(module2[i][j + 1] == b1 && module2[i + 1][j] == b1 && module2[i + 1][j + 1] == b1) penalty += 3; } } // 1:1:3:1:1 比率のパターン var cnt = new Array(); cnt.length = 7; // 行 for(i = 0; i < n_modules1; i++) { k = 0; for(j = 0; ; ) { // 同色モジュール数カウント for(; k < 7; k++) { x = j; for(; j < n_modules1; j++) { if(module2[i][j] ^ (k & 0x01)) // k = 0,2,4,6 -- 暗?,k = 1,3,5 -- 明? break; } cnt[k] = j - x; // モジュール数 if(j == n_modules1) break; } if(k >= 5) { if(k == 5) cnt[6] = 0; if(cnt[2] == cnt[1] && cnt[3] == cnt[1] * 3 && cnt[4] == cnt[1] && cnt[5] == cnt[1] && (cnt[0] >= cnt[1] * 4 || cnt[6] >= cnt[1] * 4)) { // 1:1:3:1:1 & 4 以上の明 penalty += 40; if(j < n_modules1) { // 終端でない // 続きをチェック cnt[0] = cnt[4]; cnt[1] = cnt[5]; cnt[2] = cnt[6]; k = 3; continue; } } } if(j == n_modules1) break; // 続きをチェック cnt[0] = cnt[2]; cnt[1] = cnt[3]; cnt[2] = cnt[4]; cnt[3] = cnt[5]; cnt[4] = cnt[6]; k = 5; } } // 列 for(j = 0; j < n_modules1; j++) { k = 0; for(i = 0; ; ) { // 同色モジュール数カウント for(; k < 7; k++) { y = i; for(; i < n_modules1; i++) { if(module2[i][j] ^ (k & 0x01)) // k = 0,2,4,6 -- 暗?,k = 1,3,5 -- 明? break; } cnt[k] = i - y; // モジュール数 if(i == n_modules1) break; } if(k >= 5) { if(k == 5) cnt[6] = 0; if(cnt[2] == cnt[1] && cnt[3] == cnt[1] * 3 && cnt[4] == cnt[1] && cnt[5] == cnt[1] && (cnt[0] >= cnt[1] * 4 || cnt[6] >= cnt[1] * 4)) { // 1:1:3:1:1 & 4 以上の明 penalty += 40; if(i < n_modules1) { // 終端でない // 続きをチェック cnt[0] = cnt[4]; cnt[1] = cnt[5]; cnt[2] = cnt[6]; k = 3; continue; } } } if(i == n_modules1) break; // 続きをチェック cnt[0] = cnt[2]; cnt[1] = cnt[3]; cnt[2] = cnt[4]; cnt[3] = cnt[5]; cnt[4] = cnt[6]; k = 5; } } // 暗モジュール比率 // 2004年改正 JIS X 0510 では「参考」にある例が「評価条件」と矛盾している. n1 = 0; for(i = 0; i < n_modules1; i++) { for(j = 0; j < n_modules1; j++) { if(module2[i][j]) // 暗 n1++; } } n2 = n_modules1 * n_modules1; if((n1 = Math.floor((Math.abs(n1 * 2 - n2) * 20 + (n2 * 2) - 1) / (n2 * 2))) > 1) penalty += 10 * (n1 - 1); if(penalty < min_penalty) { mask = m; min_penalty = penalty; } } masking(n_modules1, mask); // 採用したマスク パターンでマスク // 固定暗モジュール // 固定暗モジュール配置はマスク判定の前か後か? module2[n_modules1 - 8][8] = 1; // 形式情報 code1 = format_info[level][mask]; b1 = 0x4000; for(i = 0; i < 7; i++) { module2[8][(i < 6) ? i : i + 1] = module2[n_modules1 - 1 - i][8] = (code1 & b1) ? 1 : 0; b1 >>= 1; } for(i = 7; i >= 0; i--) { module2[(i < 6) ? i : i + 1][8] = module2[8][n_modules1 - 1 - i] = (code1 & b1) ? 1 : 0; b1 >>= 1; } // 型番情報 if(version >= 7) { code1 = version_info[version - 7]; b1 = 0x20000; for(i = 0; i < 18; i++) { y = n_modules1 - 9 - i % 3; x = 5 - Math.floor(i / 3); module2[y][x] = module2[x][y] = (code1 & b1) ? 1 : 0; b1 >>= 1; } } // 表示 for(i = 0; i < n_modules1; i++) { for(j = 0; j < n_modules1; j++) document.getElementById(i.toString(16) + "_" + j.toString(16)).style.backgroundColor = (module2[i][j]) ? "black" : "white"; for(; j < MAX_MOD; j++) document.getElementById(i.toString(16) + "_" + j.toString(16)).style.backgroundColor = "white"; } for(; i < MAX_MOD; i++) { for(j = 0; j < MAX_MOD; j++) document.getElementById(i.toString(16) + "_" + j.toString(16)).style.backgroundColor = "white"; } } // データ コード語数 function get_data_cws(version, level) { var n_modules; var n; n_modules = 21 + (version - 1) * 4; // 1 辺のモジュール数 n_modules = n_modules * n_modules // 総モジュール数 - 3 * (8 * 8) // 位置検出パターン & 分離パターン - 2 * (n_modules - 2 * 8) // タイミング パターン - 1 // 固定暗モジュール - 2 * 15; // 形式情報 // 位置合せパターン n = align_pos[version - 1].length; if(n) { // n > 0 n_modules -= (n * n - 3) * (5 * 5); if(n > 2) n_modules += 2 * (n - 2) * 5; // タイミング パターンと重なる分 } // 型番情報 if(version >= 7) n_modules -= 2 * 18; return (n_modules >> 3) - rs_blocks[version - 1][level] * ec_codewords[version - 1][level]; } // コード登録 function put_code(code1, code1_bits) { reg = (reg << code1_bits) | code1; reg_bits += code1_bits; while(reg_bits >= 8) { code[i_code++] = (reg >> (reg_bits - 8)) & 0xff; reg_bits -= 8; } } // 英数字モード 文字値 function alpha_val(c) { switch(c) { case " ": return 36; case "$": return 37; case "%": return 38; case "*": return 39; case "+": return 40; case "-": return 41; case ".": return 42; case "/": return 43; case ":": return 44; } if(c <= "9") return c.charCodeAt(0) - "0".charCodeAt(0); return c.charCodeAt(0) - "A".charCodeAt(0) + 10; } // マスク処理 function masking(n_modules1, mask) { var i, j; for(i = 0; i < n_modules1; i++) { for(j = 0; j < n_modules1; j++) { module2[i][j] = module1[i][j] & 0x1; if(!(module1[i][j] & 0xc0)) { // 機能パターン,形式情報,型番情報を除く switch(mask) { case 0: // (i+j)mod 2=0 if((i + j) % 2) continue; break; case 1: // i mod 2=0 if(i % 2) continue; break; case 2: // j mod 3=0 if(j % 3) continue; break; case 3: // (i+j)mod 3=0 if((i + j) % 3) continue; break; case 4: // ((i div 2)+(j div 3))mod 2=0 if((Math.floor(i / 2) + Math.floor(j / 3)) % 2) continue; break; case 5: // (i j)mod 2+(i j)mod 3=0 if(i * j % 2 + i * j % 3) continue; break; case 6: // ((i j)mod 2+(i j)mod 3)mod 2=0 if((i * j % 2 + i * j % 3) % 2) continue; break; case 7: // ((i j)mod 3+(i+j)mod 2)mod 2=0 if((i * j % 3 + (i + j) % 2) % 2) continue; break; } module2[i][j] ^= 1; // 反転 } } } } // シフト JIS 変換初期化 function shift_jis_init() { var sjis = new Uint8Array(16046); var i = 0; for(var b1 = 0x81, b2 = 0x40; b1 < 0xeb || b2 <= 0xbf; ) { sjis[i++] = b1; sjis[i++] = b2; if (b2 == 0x7e) { b2 = 0x80; } else if(b2 == 0xfc) { if(b1 == 0x9f) b1 = 0xe0; else b1++; b2 = 0x40; } else { b2++; } } var cvt = document.getElementById("cvt"); cvt.onload = function () { // Firefox 56 以上では,未定義のシフト JIS 文字の第2バイトが ASCII 文字の // コード範囲内のとき,REPLACEMENT CHARACTER + ASCII 文字の 2文字に変換され // てしまうので,ASCII 文字を取り除く. unicode = this.contentDocument.body.textContent.replace(/[\x40-\x7e]/g, "").replace(/\ufffd/g, "\u0000"); document.getElementById("cre").disabled = false; }; cvt.src = URL.createObjectURL(new Blob([sjis], {type:"text/plain;charset=Shift_JIS"})); } // シフト JIS 変換 function shift_jis(c) { var i_code = unicode.indexOf(c); var b2 = i_code % 188; var b1 = (i_code - b2) / 188; if(b1 < 31) // 第 1 バイト E0 未満 b1 += 129; else b1 += 193; if(b2 < 63) // 第 2 バイト 80 未満 b2 += 64; else b2 += 65; return (b1 << 8) | b2; } // シフト JIS 変換 13 ビット function shift_jis_13(c) { var i_code = unicode.indexOf(c); var b2 = i_code % 188; i_code += (i_code - b2) / 188 * 4; if(b2 >= 63) // 第 2 バイト 80 以上 i_code++; return i_code; } //---------------------------------------------------------- code = new Array(); // コード語作成ワーク code.length = 3706; var i_code; // コード語インデックス var reg; var reg_bits; // 誤り訂正コード語数 ec_codewords = [ // 誤り訂正レベル // L M Q H 型番 [ 7, 10, 13, 17], // 1 [10, 16, 22, 28], // 2 [15, 26, 18, 22], // 3 [20, 18, 26, 16], // 4 [26, 24, 18, 22], // 5 [18, 16, 24, 28], // 6 [20, 18, 18, 26], // 7 [24, 22, 22, 26], // 8 [30, 22, 20, 24], // 9 [18, 26, 24, 28], // 10 [20, 30, 28, 24], // 11 [24, 22, 26, 28], // 12 [26, 22, 24, 22], // 13 [30, 24, 20, 24], // 14 [22, 24, 30, 24], // 15 [24, 28, 24, 30], // 16 [28, 28, 28, 28], // 17 [30, 26, 28, 28], // 18 [28, 26, 26, 26], // 19 [28, 26, 30, 28], // 20 [28, 26, 28, 30], // 21 [28, 28, 30, 24], // 22 [30, 28, 30, 30], // 23 [30, 28, 30, 30], // 24 [26, 28, 30, 30], // 25 [28, 28, 28, 30], // 26 [30, 28, 30, 30], // 27 [30, 28, 30, 30], // 28 [30, 28, 30, 30], // 29 [30, 28, 30, 30], // 30 [30, 28, 30, 30], // 31 [30, 28, 30, 30], // 32 [30, 28, 30, 30], // 33 [30, 28, 30, 30], // 34 [30, 28, 30, 30], // 35 [30, 28, 30, 30], // 36 [30, 28, 30, 30], // 37 [30, 28, 30, 30], // 38 [30, 28, 30, 30], // 39 [30, 28, 30, 30] // 40 ]; // RS ブロック数 rs_blocks = [ // 誤り訂正レベル // L M Q H 型番 [ 1, 1, 1, 1], // 1 [ 1, 1, 1, 1], // 2 [ 1, 1, 2, 2], // 3 [ 1, 2, 2, 4], // 4 [ 1, 2, 4, 4], // 5 [ 2, 4, 4, 4], // 6 [ 2, 4, 6, 5], // 7 [ 2, 4, 6, 6], // 8 [ 2, 5, 8, 8], // 9 [ 4, 5, 8, 8], // 10 [ 4, 5, 8, 11], // 11 [ 4, 8, 10, 11], // 12 [ 4, 9, 12, 16], // 13 [ 4, 9, 16, 16], // 14 [ 6, 10, 12, 18], // 15 [ 6, 10, 17, 16], // 16 [ 6, 11, 16, 19], // 17 [ 6, 13, 18, 21], // 18 [ 7, 14, 21, 25], // 19 [ 8, 16, 20, 25], // 20 [ 8, 17, 23, 25], // 21 [ 9, 17, 23, 34], // 22 [ 9, 18, 25, 30], // 23 [10, 20, 27, 32], // 24 [12, 21, 29, 35], // 25 [12, 23, 34, 37], // 26 [12, 25, 34, 40], // 27 [13, 26, 35, 42], // 28 [14, 28, 38, 45], // 29 [15, 29, 40, 48], // 30 [16, 31, 43, 51], // 31 [17, 33, 45, 54], // 32 [18, 35, 48, 57], // 33 [19, 37, 51, 60], // 34 [19, 38, 53, 63], // 35 [20, 40, 56, 66], // 36 [21, 43, 59, 70], // 37 [22, 45, 62, 74], // 38 [24, 47, 65, 77], // 39 [25, 49, 68, 81] // 40 ]; // 誤り訂正コード 生成多項式係数 α指数 g_exp_t = new Array(); g_exp_t.length = 30; g_exp_t[ 6] = [87, 229, 146, 149, 238, 102, 21]; g_exp_t[ 9] = [251, 67, 46, 61, 118, 70, 64, 94, 32, 45]; g_exp_t[12] = [74, 152, 176, 100, 86, 100, 106, 104, 130, 218, 206, 140, 78]; g_exp_t[14] = [8, 183, 61, 91, 202, 37, 51, 58, 58, 237, 140, 124, 5, 99, 105]; g_exp_t[15] = [120, 104, 107, 109, 102, 161, 76, 3, 91, 191, 147, 169, 182, 194, 225, 120]; g_exp_t[16] = [43, 139, 206, 78, 43, 239, 123, 206, 214, 147, 24, 99, 150, 39, 243, 163, 136]; g_exp_t[17] = [215, 234, 158, 94, 184, 97, 118, 170, 79, 187, 152, 148, 252, 179, 5, 98, 96, 153]; g_exp_t[19] = [17, 60, 79, 50, 61, 163, 26, 187, 202, 180, 221, 225, 83, 239, 156, 164, 212, 212, 188, 190]; g_exp_t[21] = [210, 171, 247, 242, 93, 230, 14, 109, 221, 53, 200, 74, 8, 172, 98, 80, 219, 134, 160, 105, 165, 231]; g_exp_t[23] = [229, 121, 135, 48, 211, 117, 251, 126, 159, 180, 169, 152, 192, 226, 228, 218, 111, 0, 117, 232, 87, 96, 227, 21]; g_exp_t[25] = [173, 125, 158, 2, 103, 182, 118, 17, 145, 201, 111, 28, 165, 53,161, 21, 245, 142, 13, 102, 48, 227, 153, 145, 218, 70]; g_exp_t[27] = [168, 223, 200, 104, 224, 234, 108, 180, 110, 190, 195, 147, 205, 27, 232, 201, 21, 43, 245, 87, 42, 195, 212, 119, 242, 37, 9, 123]; g_exp_t[29] = [41, 173, 145, 152, 216, 31, 179, 182, 50, 48, 110, 86, 239, 96, 222, 125, 42, 173, 226, 193, 224, 130, 156, 37, 251, 216, 238, 40, 192, 180]; // 位置検出パターン & 分離パターン & 形式情報位置予約(一部)& 固定暗モジュール用データ finder_pat = [ // [0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x41], [0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40], [0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x40], [0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x40], [0x80, 0x81, 0x80, 0x81, 0x81, 0x81, 0x80, 0x81, 0x80, 0x40], [0x80, 0x81, 0x80, 0x81, 0x81, 0x81, 0x80, 0x81, 0x80, 0x40], [0x80, 0x81, 0x80, 0x81, 0x81, 0x81, 0x80, 0x81, 0x80, 0x40], [0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x40], [0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x40], [0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40] ]; // 位置合せパターン座標 align_pos = [ // 型番 [], // 1 [ 6, 18], // 2 [ 6, 22], // 3 [ 6, 26], // 4 [ 6, 30], // 5 [ 6, 34], // 6 [ 6, 22, 38], // 7 [ 6, 24, 42], // 8 [ 6, 26, 46], // 9 [ 6, 28, 50], // 10 [ 6, 30, 54], // 11 [ 6, 32, 58], // 12 [ 6, 34, 62], // 13 [ 6, 26, 46, 66], // 14 [ 6, 26, 48, 70], // 15 [ 6, 26, 50, 74], // 16 [ 6, 30, 54, 78], // 17 [ 6, 30, 56, 82], // 18 [ 6, 30, 58, 86], // 19 [ 6, 34, 62, 90], // 20 [ 6, 28, 50, 72, 94], // 21 [ 6, 26, 50, 74, 98], // 22 [ 6, 30, 54, 78, 102], // 23 [ 6, 28, 54, 80, 106], // 24 [ 6, 32, 58, 84, 110], // 25 [ 6, 30, 58, 86, 114], // 26 [ 6, 34, 62, 90, 118], // 27 [ 6, 26, 50, 74, 98, 122], // 28 [ 6, 30, 54, 78, 102, 126], // 29 [ 6, 26, 52, 78, 104, 130], // 30 [ 6, 30, 56, 82, 108, 134], // 31 [ 6, 34, 60, 86, 112, 138], // 32 [ 6, 30, 58, 86, 114, 142], // 33 [ 6, 34, 62, 90, 118, 146], // 34 [ 6, 30, 54, 78, 102, 126, 150], // 35 [ 6, 24, 50, 76, 102, 128, 154], // 36 [ 6, 28, 54, 80, 106, 132, 158], // 37 [ 6, 32, 58, 84, 110, 136, 162], // 38 [ 6, 26, 54, 82, 110, 138, 166], // 39 [ 6, 30, 58, 86, 114, 142, 170] // 40 ]; // 形式情報 format_info = [ // Level + Mask BCH 符号(マスク前) [0x77c4, // L + 000 0x23d6 0x72f3, // L + 001 0x26e1 0x7daa, // L + 010 0x29b8 0x789d, // L + 011 0x2c8f 0x662f, // L + 100 0x323d 0x6318, // L + 101 0x370a 0x6c41, // L + 110 0x3853 0x6976], // L + 111 0x3d64 [0x5412, // M + 000 0x0000 0x5125, // M + 001 0x0537 0x5e7c, // M + 010 0x0a6e 0x5b4b, // M + 011 0x0f59 0x45f9, // M + 100 0x11eb 0x40ce, // M + 101 0x14dc 0x4f97, // M + 110 0x1b85 0x4aa0], // M + 111 0x1eb2 [0x355f, // Q + 000 0x614d 0x3068, // Q + 001 0x647a 0x3f31, // Q + 010 0x6b23 0x3a06, // Q + 011 0x6e14 0x24b4, // Q + 100 0x70a6 0x2183, // Q + 101 0x7591 0x2eda, // Q + 110 0x7ac8 0x2bed], // Q + 111 0x7fff [0x1689, // H + 000 0x429b 0x13be, // H + 001 0x47ac 0x1ce7, // H + 010 0x48f5 0x19d0, // H + 011 0x4dc2 0x0762, // H + 100 0x5370 0x0255, // H + 101 0x5647 0x0d0c, // H + 110 0x591e 0x083b] // H + 111 0x5c29 ]; // 型番情報 // 型番 version_info = [0x07c94, // 7 0x085bc, // 8 0x09a99, // 9 0x0a4d3, // 10 0x0bbf6, // 11 0x0c762, // 12 0x0d847, // 13 0x0e60d, // 14 0x0f928, // 15 0x10b78, // 16 0x1145d, // 17 0x12a17, // 18 0x13532, // 19 0x149a6, // 20 0x15683, // 21 0x168c9, // 22 0x177ec, // 23 0x18ec4, // 24 0x191e1, // 25 0x1afab, // 26 0x1b08e, // 27 0x1cc1a, // 28 0x1d33f, // 29 0x1ed75, // 30 0x1f250, // 31 0x209d5, // 32 0x216f0, // 33 0x228ba, // 34 0x2379f, // 35 0x24b0b, // 36 0x2542e, // 37 0x26a64, // 38 0x27541, // 39 0x28c69]; // 40 exp_n = new Array(); // α指数 → 数値 変換テーブル exp_n.length = 255; n_exp = new Array(); // 数値 → α指数 変換テーブル([0] は使用しない) n_exp.length = 256; // α指数 ― 数値 変換テーブル作成 n = 0x01; for(i = 0; i < 255; i++) { exp_n[i] = n; n_exp[n] = i; n <<= 1; if(n & 0x100) n = n & 0xff ^ 0x1d; } module1 = new Array(); // シンボル領域 module1.length = MAX_MOD; module2 = new Array(); // マスク後シンボル領域 module2.length = MAX_MOD; for(i = 0; i < MAX_MOD; i++) { module1[i] = new Array(); module1[i].length = MAX_MOD; module2[i] = new Array(); module2[i].length = MAX_MOD; } //--> </SCRIPT> </BODY> </HTML> |