我现在正在制作一个系统,要求用户登录系统,客户希望使用条形码扫描仪和卡来降低价格。 (是的用户名和密码更便宜,但她想要一种卡式解决方案,所以她得到一个。)
我的所有数据都使用GUID作为关键字段,因此我想将GUID直接存储在条形码中的卡片上。虽然它足够简单,可以将其编码为9中的3,但它不会最有效地利用空间。
在条形码中存储GUID是否有最佳实践或最有效的方法?我已经假设,因为数据的长度和深度都是一致的,所以会有一个标准,但我找不到它。很容易生成我自己的 - 控制字符两端,然后是二进制数据,但想要标准读者知道如何解释。
感激不尽的任何帮助。
答案 0 :(得分:22)
没有使用通用线性条形码(如Code 39和Code 128)进行专用数据压缩的开放标准。大多数ISO / IEC标准化的二维条形码确实支持称为扩展通道解释(ECI)的专用数据编码机制它允许您指定数据符合特定的应用程序标准或编码方案,例如ECI 298765用于IPv4地址压缩 [*] 。不幸的是,GUID压缩不在已经注册的那些中,即使它们仍然需要在您的应用程序中处理这个,因为缺乏读者支持。
这使您不得不将GUID预编码(并随后解码)为一种可以通过一些无处不在的条形码符号系统有效处理的格式。
存储GUID的有效方法是将其转换为40位 [†] 十进制表示,并使用双密度数值压缩将结果存储在Code 128条形码中(“模式” C“)。
例如,考虑GUID:
cd171f7c-560d-4a62-8d65-16b87419a58c
以十六进制数表示:
0xCD171F7C560D4A628D6516B87419A58C
转换为40位小数:
0272611800569275698104677545117639878028
在Code 128条形码中编码 [‡] :
您的应用程序当然需要将此输入识别为十进制编码的GUID并反转上述过程但我怀疑存在一种更有效的方法,它不需要您将数据转换为异常的基数然后处理扫描时处理ASCII控制字符的复杂性。
[*]分配的ECI代码的注册表可以作为"ECI Part 3: Register"从AIM商店免费获得。
[†]虽然可以将整个GUID范围存储在39位数内,但39位模式C代码128符号实际上长于40位符号。