在【Minecraft】中,使用命令生成QR代码
概述
我制作了一个在Minecraft中可以创建QR代码的数据包。这篇文章是我制作的记录。
この記事はQRコードの仕組み等を解説するものではありません. QRコードの仕様については他サイトを参照してください.
数据包
细节的实现还不够完善(如转义字符等)。如果感兴趣的话,将会加以改善。
能做的事情
您可以通过String型NBT创建QR码。就是这样。
在制作这个项目时
在实施过程中,我们完全参考了Thonky.com的QR码教程。
首先,我們以普通的編程語言實現了一個可以容易地轉換成命令的處理方法,然後按照這個方針進行了移植。
コマンドで実装する上での一番の問題点はコマンド実行数上限です.そもそも QR コード自体が最大で $177\times 177=31329$ マスになるというどうしようもない制約があるので,ある程度は諦めて実装しやすさを優先し,なんとかなりそうなところはコマンド数削減を図りました.
生成QR码的步骤
生成QR码所需处理大致如下。
-
- モード判定
-
- 大きさ判定
-
- データエンコード
-
- 誤り訂正符号生成
-
- QR コード生成
- マスク適用
模式检测
QR码通常主要用于以下模式。
-
- 数字モード:0-9 のみ.
-
- 英数字モード:0-9A-Z $%*+-./: のみ.
-
- バイトモード:バイナリを扱える.今回は UTF-8 でエンコードした.
- 漢字モード:Shift-JIS で一定の範囲にある文字を扱える.
这次由于实施起来很麻烦,我放弃了使用汉字模式。
判断数字模式和英数字模式是否可用,可以逐个字符进行比较非常容易(与数据编码类似)。
请注意,在命令行中,如果有连续两个或更多的半角空格,则会被缩减为一个空格。此外,在字节模式下,还需要单独处理\、”和’。
判断尺寸
我会检查并填写包括不同尺寸下的最大文字数等参数。
数据编码
需要将字符串转换为01序列。
-
- あらかじめ {“A”:[…],”B”:[…],…} といった形の辞書データを準備しておきます.
-
- 文字列が空でない間,次のことを繰り返します.
data modify の set string [] 0 1 で先頭の1文字を切り出します.
マクロを用いてその文字に対応する辞書のデータを読み出します.
data modify の set string [] 1 で先頭1文字を削除します.
在数字模式和英数字模式下,需要将要转换的字符串按照一定的字符数进行分隔,并进行批量转换。虽然可以逐个字符进行转换,但由于这样过于繁琐,因此我已经将所有可能的字符组合都嵌入其中。
在字节模式下,必须获取每个字符的字符编码。由于全部嵌入是不现实的,因此在默认情况下,我们对可使用的字符进行了一定的限制,并允许从外部添加相应的字符。
生成错误校正码
生成誤碼需要在$GF(256)$的有限域中進行多項式除法。
在$GF(256)$中进行的运算已经被嵌入。为了方便处理字节类型,我们不使用$0,\dots,255$而是使用$-128,\dots,127$来表示值。感谢您可以在列表中使用负索引。
关于多项式除法,在误码纠正码生成中,被除多项式不依赖于输入数据。虽然可以在筆算中嵌入它们,但我觉得这样的实现有点麻烦,所以我事先计算并嵌入了它们割以 $x^0,x^1,x^2,\dots\in GF(256)[x]$ 的结果,并通过线性组合来实现。
生成QR码/应用口罩
只需按顺序排列固定的模式或生成的数据。当排列数据时,需要将循环循环好,所以可以说有点麻烦,但相比其他部分,要简单得多。
由于只需对数据部分应用掩码,所以我们决定不是先生成代码然后再应用掩码,而是在生成代码的同时应用掩码。
最佳口罩評估
因为指令数量非常庞大,所以我们这次并未实施,虽然要做的事情很简单。
我的想法
直到能够显示QR码之前,我只能不断地与数字序列进行对视调试,真是很辛苦……但当它最终显示出来,能够真正读取的时候,感到非常开心和满足(此消彼长)。
由于命令数量惊人,实用性可疑。或许着色器可以做到?