目录
介绍
背景
使用代码
用于4位编码器的代码,用于存储15个不同符号,效率更高
介绍将8位字符串转换为4位字符串(最多允许15个不同的字符)。
分别:将两个 8位字符串转换为一个 8位字符串。
通过这种转换,可以使用通常尺寸的1/2来存储字符串string。这可能对大量数据有用,最多使用15个不同的字符(像电话号码)。
背景我在想,将电话号码以string形式存储在数据库中是浪费内存。但是也不可能存储为整数。我的解决方案是对string使用编码。
使用代码下面,您将看到该类的实现。在底部,有一个test()函数,显示如何使用代码。
为了自定义可以展示/编码的符号,请进行更改Encode4Bits._mappingTable。切勿使用超过15个自定义值。
class Encode4Bits:
def __init__(self):
# first element is always "END"
self._mappingTable = ['\0', \
'0','1','2','3','4','5','6','7','8','9', \
'-','','','','']
def _encodeCharacter(self,char):
"""@return index of element or None, if not exists"""
for p in range(len(self._mappingTable)):
if(char == self._mappingTable[p]):
return p
return None
def encode(self, string):
strLen = len(string)
# ===== 1. map all chars to an index in our table =====
mappingIndices = []
for i in range(strLen):
char = string[i]
index = self._encodeCharacter(char)
if(index is None):
raise("ERROR: Could not encode '" + char + "'.")
mappingIndices.append(index)
mappingIndices.append(0)
# ===== 2. Make num values even =====
# 4 bit => 2 chars in one byte. Therefore: need even num values
if(len(mappingIndices) % 2 != 0):
mappingIndices.append(0)
# ===== 3. create string =====
ret = ""
i = 0
while True:
if(i >= len(mappingIndices)):
break # finished
val1 = mappingIndices[i]
val2 = mappingIndices[i+1]
val1 = val1 > 4
index2 = (ord(char) & 0x0F)
ret += self._mappingTable[index1]
ret += self._mappingTable[index2]
return ret
def test():
numberCompressor = Encode4Bits()
encoded = numberCompressor.encode("067-845-512")
decoded = numberCompressor.decode(encoded)
print(len(decoded))
print(len(encoded))
if __name__ == "__main__":
test()
原文地址:https://www.codeproject.com/Tips/1276497/4-bit-encoder-decoder