…L@ hñ/;‡@X K"Y^ÒšTy"È¡a"²*µöz½0uü°êN(x`¶X@\çÁO\â ÇV¦“
f-~í/®á‡S™G7Ðð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