Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook.
实际上它的意思是这样的
Brainfuck的命令替换
我想做的编码方法原理和它是不一样的,只是看起来好像就是那些字符,哈哈
规划
既然是简单的,那么就不考虑编码和解码的效率、可靠性了
编码时我就直接把字符串先转换为二进制,然后用特定字符替代
解码时就把特定字符先转换为二进制再转换回字符串
开始
编码
既然是简单的,那么简单的语言能够快速完成想法,这里选了Python3
先把字符串转换成整数型数值,再转换成二机制
一个个来,那么就用循环搞定
1 2 3 4 5 6 7 8
a = "str input哈"
for i inrange(len(a)): print(a[i], end=":") b = ord(a[i]) c = bin(b) print(" to bin: {}".format(c))
for i inrange(len(a)): #print(a[i]) b = ord(a[i]) c = bin(b) d = str(c) for ii inrange(len(d) - 1): if d[ii] + d[ii+1] == "0b": encode_str += code2 elif ii > 1: encode_str += code1 if ii > 0: if d[ii+1] == "0": encode_str += state1 else: encode_str += state2
for i inrange(len(a)): #print(a[i]) b = ord(a[i]) c = bin(b) d = str(c) if_index_is_zer0 = 0 d = d[2:len(d)] for ii inrange(len(d)): if if_index_is_zer0 == 0: encode_str += code2 if_index_is_zer0 = 1 else: encode_str += code1 if d[ii] == "0": encode_str += state1 else: encode_str += state2
print(encode_str)
解码
解码过程感觉要简单一点
先把LX开头的字符串单独拎出来
如何找LX开头?可以判断索引值能否被3整除
1 2 3 4 5 6 7 8
a = "LX?Lx?Lx?Lx!Lx!Lx?Lx?LX?Lx?Lx?Lx!Lx?Lx!Lx!LX?Lx?Lx?Lx!Lx!Lx?Lx!LX?Lx!Lx!Lx!Lx!Lx!LX?Lx?Lx!Lx?Lx!Lx!Lx?LX?Lx?Lx!Lx?Lx?Lx?Lx!LX?Lx?Lx?Lx!Lx!Lx!Lx!LX?Lx?Lx?Lx!Lx?Lx!Lx?LX?Lx?Lx?Lx!Lx?Lx!Lx!LX?Lx!Lx?Lx!Lx?Lx!Lx!Lx?Lx?Lx!Lx!Lx?Lx!Lx!Lx!"
for i inrange(len(a)): if i % 3 == 0: print(a[i], end="") print(a[i+1], end="") print(a[i+2], end=" ")
for i inrange(len(a)): if i % 3 == 0: if a[i+1] == "X": count.append(i) iflen(count) == 2: str_yiduan = a[count[0]:count[1]] count[0] = count[1] count.pop() print(str_yiduan)
输出如图
加上
1 2
if i == len(a) - 3: count.append(i)
这样写才是正确的
1 2 3 4 5 6 7 8 9 10 11
for i inrange(len(a)): if i % 3 == 0: if a[i+1] == "X": count.append(i) if i == len(a) - 3: count.append(i+3) iflen(count) == 2: str_yiduan = a[count[0]:count[1]] count[0] = count[1] count.pop() print(str_yiduan)
转回去到存储二进制字符串
1 2 3 4 5 6 7 8 9 10
for i in str_store: str_read = "0b" for ii inrange(len(i)): if ii % 3 == 0: if i[ii+2] == "!": str_read += '0' elif i[ii+2] == "?": str_read += '1'
print(str_read)
结果如下
把字符串中的二进制转成十进制(后面使用chr()函数要求输入10进制)
1
int(str_read,2)
扩展知识:
字符串(如“0b1110011”)转二进制可以这样写
1
str_read.encode()
再转回字符串
1
chr(int(str_read,2))
非常可惜的是,中文没法转回来,估计要用GBK编码
再处理一下
1 2 3 4 5 6 7 8 9
for i in str_store: str_read = "0b" for ii inrange(len(i)): if ii % 3 == 0: if i[ii+2] == state1: str_read += '0' elif i[ii+2] == state2: str_read += '1' decode_str += chr(int(str_read,2))
a = "LX?Lx?Lx?Lx!Lx!Lx?Lx?LX?Lx?Lx?Lx!Lx?Lx!Lx!LX?Lx?Lx?Lx!Lx!Lx?Lx!LX?Lx!Lx!Lx!Lx!Lx!LX?Lx?Lx!Lx?Lx!Lx!Lx?LX?Lx?Lx!Lx?Lx?Lx?Lx!LX?Lx?Lx?Lx!Lx!Lx!Lx!LX?Lx?Lx?Lx!Lx?Lx!Lx?LX?Lx?Lx?Lx!Lx?Lx!Lx!LX?Lx!Lx?Lx!Lx?Lx!Lx!Lx?Lx?Lx!Lx!Lx?Lx!Lx!Lx!"
for i inrange(len(a)): if i % 3 == 0: #print(a[i],a[i+1],a[i+2]) if a[i+1] == code2[len(code2)-1]: count.append(i) if i == len(a) - 3: count.append(i+3) iflen(count) == 2: str_yiduan = a[count[0]:count[1]] count[0] = count[1] count.pop() str_store.append(str_yiduan) print(str_yiduan) print("\n", end="") for i in str_store: str_read = "0b" for ii inrange(len(i)): if ii % 3 == 0: if i[ii+2] == state1: str_read += '0' elif i[ii+2] == state2: str_read += '1' decode_str += chr(int(str_read,2))