勞動節快樂!手寫個核心價值觀編碼工具 - Python實現

程式設計實驗室發表於2022-05-01

前言

今天是五一勞動節,祝各位無產階級勞動者節日快樂!

然後來整活分享一些有趣的東西~

這個小工具是我大學時做著玩的,對於各位接班人來說,12個詞的核心價值觀這東西,大家都非常熟悉了,這工具可以實現將一段話編碼為核心價值觀實現加密,同時也能將密文解密出來。

為啥要做這個呢,隔太久不太記得了,好像是因為遊戲裡噴隊友老是被遮蔽,靈機一動,要是換成和諧的文字不就不會被遮蔽了嗎(誤

實現原理

簡單說下原理,很簡單,我們的文字在計算機中表示為ASCII碼,對計算機來說所有資料都是0和1,即二進位制的,而我們所熟悉的“核心價值觀”有12個詞,每個詞可以表示一位,所以我們可以定義一種新的編碼,以“價值觀”組成的12進位制編碼~

只需要把二進位制的ASCII字元轉換成12進位制的“價值觀”編碼就可以了。

開始程式碼

搞清楚原理就可以開始寫程式碼了,本文使用Python語言來實現(接下來可能會嘗試一下其他語言的實現)

這裡用到了Python的標準庫binascii,用來處理ASCII編碼,先import進來

ASCII轉2進位制可以用binascii標準庫實現,轉12進位制就得我們自己來實現了。

(當時)考慮到二進位制直接轉12進位制比較麻煩,我折中一下,先2進位制轉10進位制,然後再轉12進位制

10進位制轉12進位制的程式碼如下

def from_num(input_num: int, b: int) -> int:
    """
    將數字轉換為指定進位制
    :param input_num: 輸入的數字
    :param b: 進位制
    :return: 輸出結果
    """
    return ((input_num == 0) and "0") or \
           (from_num(input_num // b, b).lstrip("0") + "0123456789abcdefghijklmnopqrstuvwxyz"[input_num % b])

前置條件滿足了,我們開始來寫加密的程式碼

def encode(raw: str) -> str:
    """
    編碼
    :param raw: 輸入的原始字串
    :return: 返回編碼結果
    """
    result = list()
    for char in raw:
        # 把字元轉換為16進位制字串
        str_16 = binascii.b2a_hex(char.encode('utf-8'))
        # 把16進位制字串轉換為10進位制數字
        num_10 = int(str_16, 16)
        str_12 = str(from_num(num_10, 12))
        result.append(char_replace(str_12))

    return ','.join(result)

程式碼很簡單,註釋裡面都寫清楚了。

然後是解密,只需要把加密過程逆向一遍就行

def decode(encoded: str) -> str:
    """
    解碼
    :param encoded: 已編碼字串
    :return: 解碼的原始字串
    """
    str_list = encoded.split(',')
    result = list()
    for char_list in str_list:
        # 整個12進位制字串
        char_12 = ''
        for char in char_list.split(' '):
            # 還原出12進位制字串
            str_12 = str(total_list.index(char))
            if str_12 == '10':
                str_12 = 'a'
            if str_12 == '11':
                str_12 = 'b'
            char_12 += str_12
        # 12進位制串轉換為10進位制數
        num_10 = int(char_12, 12)
        str_16 = hex(num_10)

        result.append(binascii.a2b_hex(str_16[2:]).decode('utf-8'))
    return ''.join(result)

測試效果

程式碼寫完了,來測試一下效果如何

print(encode('勞動節快樂'))

結果

平等 富強 平等 平等 法治 富強 和諧,平等 富強 平等 平等 公正 友善 自由,平等 民主 文明 友善 自由 富強 文明,平等 富強 公正 民主 平等 文明 和諧,平等 富強 文明 誠信 法治 文明 愛國

有點長,哈哈哈,玩玩就還行

試試解密

print(decode('平等 富強 平等 平等 法治 富強 和諧,平等 富強 平等 平等 公正 友善 自由,平等 民主 文明 友善 自由 富強 文明,平等 富強 公正 民主 平等 文明 和諧,平等 富強 文明 誠信 法治 文明 愛國'))

可以正常得到原文

勞動節快樂

線上測試

簡單寫了個頁面,大家有興趣可以玩玩:http://dc.sblt.deali.cn:9800/core-socialist-values/

PS:加密完發在留言裡效果更佳

相關文章