您当前的位置: 首页 > 

寒冰屋

暂无认证

  • 1浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

4位编码器/解码器

寒冰屋 发布时间:2019-02-14 21:43:19 ,浏览量:1

目录

介绍

背景

使用代码

用于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

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0513s