【发布时间】:2011-06-11 01:16:37
【问题描述】:
我有一个应用程序,我使用打印的二维码通过数据库记录识别现实生活中的对象。
数据库使用 GUID 作为主键(这是不可协商的,因为它是一个偶尔连接的系统)。
为了使二维码尽可能小,我尝试将我的 32 个字符的十六进制 GUID 转换为更短的字符串,该字符串利用字母数字二维码中可用的 36 个字符字母(0-9 和 AZ)。
整个基本转换都超出了我的想象,因此非常感谢任何帮助。
【问题讨论】:
我有一个应用程序,我使用打印的二维码通过数据库记录识别现实生活中的对象。
数据库使用 GUID 作为主键(这是不可协商的,因为它是一个偶尔连接的系统)。
为了使二维码尽可能小,我尝试将我的 32 个字符的十六进制 GUID 转换为更短的字符串,该字符串利用字母数字二维码中可用的 36 个字符字母(0-9 和 AZ)。
整个基本转换都超出了我的想象,因此非常感谢任何帮助。
【问题讨论】:
您可以将 GUID 存储为字节数组并将其转换为 Base32。
【讨论】:
我会将其转换为比 Base32 小 20% 的 Base64。转换为 base64 的库或示例代码很容易获得。 base64 的唯一问题显然是字母 'a' 和 'A' 根据 base64 不同但不一定与您的数据库不同,因此如果您选择 Base64 而不是 Base32,那么您必须检查您的数据库表排序规则是正确设置。
【讨论】:
全局唯一标识符 (GUID) 的值可以表示为 32 个字符的十六进制字符串,但通常存储为 128 位(16 字节)整数。
我怀疑可以存储这种 128 位值的最小可能 QR 码是指定“二进制/字节编码”(可以存储任何 8 位字节) 并直接存储 16 个字节。 它以每比特 1 个像素、每字节 8 个像素(加上标准开销比特)进行编码。 我很确定所有其他有效的 QR 编码将使用至少每比特 1 个像素并具有相同的标准开销。 因此,您不会通过任何类型的 Base64 或 Base45 或 Base36 或 Base32 转换获得更小的 QR 码。
我见过的大多数编码 URL 的二维码都使用相同的“二进制/字节编码”来支持小写字母。 在我的经验中,使用“字母数字编码”的 QR 码不太常见——当用于对 URL 进行编码时,它们会解码为全大写 URL(因为它们只能存储 0-9、A-Z 的 45 个符号 [仅大写]、空格、$、%、*、+、-、.、/、:)。 “每 2 个字符 11 位”在许多情况下非常聪明,但在编码 GUID 时并没有真正的帮助。
你见过http://www.younoodle.com/startups/barcode_guid或Wikipedia:spime吗?
【讨论】:
将 GUID 作为 16 字节整数存储在 QR 码中是获取小 QR 码的最佳方式,如果您发现它在物理上仍然太大,请考虑渲染 微型 QR 码。 [https://www.qrcode.com/en/codes/microqr.html] (无法进一步压缩二维码,因为它们已经接近最大熵)
【讨论】: