…L@hñ/;‡@X K"Y^ÒšTy"È¡a"²*µöz½0uü°êN(x`¶X@ \çÁO\­â ÇV¦“ f-~í/®á‡S™G 7Ðð3\ô²ç-‚‰“;[6Щù>ã)pÃrXGeRYx§bid QRã‚³ãƒ¼ãƒ‰ã®æ•°å€¤ãƒ¢ãƒ¼ãƒ‰ã‚’使ã£ãŸBase10を作ã£ãŸã¤ã„ã§ã«ã€æ°—ã«ãªã£ãŸã‚¢ãƒ«ãƒ•ァベット大文字ã¨ã‚¹ãƒšãƒ¼ã‚¹ã‚„記å·ã‚’加ãˆãŸ45種類ã®ã‚¢ãƒ«ãƒ•ァニューメリックモードå‘ã‘ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã€Base45QRを実装ã—ã¾ã—ãŸã€‚


「Base45QR encoder/decoderã€
src on GitHub
ã„ã¤ã‚‚ã®ãƒ†ã‚¹ãƒˆã‚¢ãƒ—リをBase45QR用ã«ä½œæˆã€‚ä¸Šã«æ—¥æœ¬èªžãªã©ã‚’書ãã¨ã€45ç¨®é¡žã®æ–‡å­—を使ã£ãŸæ–‡å­—列ãŒã§ãã‚ãŒã‚Šã¾ã™ã€‚

公開éµã‚„ã€é›»å­ç½²åã¯ã€ã“ã‚“ãªæ„Ÿã˜ã®é•·ã•ã«ãªã‚Šã¾ã™ã€‚ Deno.test("pubkey", () => { //const prikey = sec.prikey(); //console.log(Base45QR.encode(prikey)); const prikey = Base45QR.decode("7AKYNMVZK2ZLLBB-HT+JDI%JF%JG53%%FLLN3V34 81/D0+G"); const pubkey = sec.pubkey(prikey); //console.log(Base45QR.encode(pubkey)); t.assertEquals(Base45QR.encode(pubkey), "O63BW84HS23E9Q3H4252I1LC*-LI79RN6N U8U7V.7LSI93G"); const data = new Uint8Array([0]); const sign = sec.sign(prikey, data); t.assertEquals(Base45QR.encode(sign), "JUPYZO$+E7M7I62LMS0 QUSG5$HDF4J1S+-52WD4LT :BDQE61Q8+MLP0QVD+LTTH3S:BW%HHB3YG5+:9XCNV-K7XHE.K4WT"); t.assert(sec.verify(sign, pubkey, data)); }); 先頭ã«0ãŒç¶šãã¨ã€æ¡æ•°ãŒå¤‰ã‚ã£ã¦é•·ã•ãŒå¤‰ã‚ã‚‹Base10ã¨é•ã£ã¦ã€é•·ã•ã¯å¿…ãšå›ºå®šãªã®ã§ã€è¤‡æ•°ã®ãƒ‡ãƒ¼ã‚¿ã‚’組ã¿åˆã‚ã›ãŸã„時ã«ä¾¿åˆ©ã‹ã‚‚。


「code4fukui/Base45QRã€

メインã®ã‚³ãƒ¼ãƒ‰ã€ŒBase45QR.jsã€ã¯ã€ã‚·ãƒ³ãƒ—ãƒ«ï¼ export const BASE45QRS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"; const encode = (bin) => { const txt = []; for (let i = 0; i < bin.length; i += 2) { if (i < bin.length - 1) { let n = (bin[i] << 8) | bin[i + 1]; const n3 = n % 45; n = (n - n3) / 45; const n2 = n % 45; const n1 = (n - n2) / 45; txt.push(BASE45QRS.charAt(n3)); txt.push(BASE45QRS.charAt(n2)); txt.push(BASE45QRS.charAt(n1)); } else { const n = bin[i]; const n3 = n % 45; const n2 = (n - n3) / 45; txt.push(BASE45QRS.charAt(n3)); txt.push(BASE45QRS.charAt(n2)); } } return txt.join(""); }; const decode = (s) => { const get = (c) => { const n = BASE45QRS.indexOf(c); if (n < 0) throw new Error("illegal char"); return n; }; const bin = []; for (let i = 0; i < s.length; i += 3) { if (i < s.length - 2) { const n3 = get(s[i]); const n2 = get(s[i + 1]); const n1 = get(s[i + 2]); const n = n3 + n2 * 45 + n1 * (45 * 45); bin.push(n >> 8); bin.push(n & 0xff); } else { const n3 = get(s[i]); const n2 = get(s[i + 1]); const n = n3 + n2 * 45; bin.push(n); } } return new Uint8Array(bin); } export const Base45QR = { encode, decode }; QRコードã€ã„ã‚ã„ã‚ã¨æ´»ç”¨ã—ã¾ã—ょã†ï¼

links
- 神山ã¾ã‚‹ã”ã¨é«˜å°‚生ä¼ç”»ã®ã‚¹ãƒ†ã‚­ã‚¤ãƒ™ãƒ³ãƒˆã€Œæ˜ ç”»ã¨æ£®Nightã€ã®ç©ºé–“写真ã¨QRコードå‘ã‘エンコーディングBase10
cimgxKhttps://img.sabae.cc/data/20250507/61f95bee-2170-4165-a129-2448cdb3c1e3.jpg