我正在使用字符串生成QR码,这些字符串的长度很容易长,然后QRCode可以处理。我正在寻找关于算法的建议,以尽可能小地编码这些字符串,或者证明字符串不能再缩小。
由于我正在编码一系列项目,我可以使用ID表示它们并使用管道描述它们,如下面的查找表中所示:
function encodeLookUp(character){
switch(character){
case '0': return '0000';
case '1': return '0001';
case '2': return '0010';
case '3': return '0011';
case '4': return '0100';
case '5': return '0101';
case '6': return '0110';
case '7': return '0111';
case '8': return '1000';
case '9': return '1001';
case '|': return '1010';
case ':': return '1011';
}
return false;
}
使用此表我已经在进行16进制编码,因此原始字符串中的每个32个ascii字符变为新字符串中的半个字符(有效地将长度减半)。
Starting String: 01251548|4654654:4465464 // ID1 | ID2 : ID3 demonstrates both pipes.
Bit String: 000000010010010100010101010010001010010001100101010001100101010010110100010001100101010001100100
Result String: %H¤eFT´FTd // Half the length of the starting string.
然后根据QRCode规范翻译这个新的ascii代码。
编辑:当前可编码的字符数最多:384
澄清:ID号码长度和ID或管道的数量都是可变的,并且趋向于1。我希望能够减少这个算法,以便在“结果字符串”时平均包含最少量的字符。
注意:结果字符串只是二进制字符串的ascii表示,我用数据编码符合标准QRCode规范和读者。
答案 0 :(得分:0)
使用该功能,你将失去很多空间(因为4位对于12种组合来说存储太多了)。
我首先查看ID的最大长度,然后找到合适的存储块。
如果您以固定计数(例如,4个ID)连续存储这些项目。你最多需要id_length * id_count,你不需要使用任何分隔符。
编辑:根据您要编写的ID数量及其预期的最大长度,可能会有不同类型的编码来压缩它。我想到了RLE(行程编码)。
答案 1 :(得分:0)
如果您有相对非随机的数据,Huffman encoding可能是一个很好的解决方案。
答案 2 :(得分:0)
QR码已经具有针对数字或仅字母数字数据优化的特殊编码模式。利用这些可能更容易,而不是发明一个方案。
如果你要做一些自定义的事情,我认为你会发现很难击败像gzip压缩这样的东西。只需gzip字节,在字节模式下编码字节,然后在另一端解压缩。
答案 3 :(得分:0)
作为我自己问题答案的开头:
如果我从一串数字开始
我可以解析该字符串的模式,并将这些模式保存在特殊符号中,这些符号能够占用我的Huffman树中可用的其他4个空格。
编辑:示例:盯着字符串12222345,结束字符串12x345。其中x是一个符号,表示“重复最后一个符号3次”
答案 4 :(得分:0)
QR码支持二进制模式,这将是您存储ID的最有效方式。之一:
另请注意,QR码可能比384个字符大很多!
编辑:但是,从您的原始问题来看,您看起来编码的不只是一系列整数 - 您至少有两种不同类型的分隔符。他们在哪里出现以及在什么情况下出现?编码格式将取决于这些参数。