纯粹自娱自乐:纯数学(位运算),utf-8与utf-32互换
自己写完了也不知道有神马用,正如注释里面表述,都给出了单行非数学的方法了
动机:字节数据的list()就是一个整数数列,试图在不转换字符串再正则的情况下找到汉字
结果:失败,还是要先知道编码……
收益:总算搞清楚了utf-8的算法 有兴趣的人参看wiki utf-8条目
# 下面的运算相当于 list('a中b文信c息d'.encode('utf-8'))
sl = [97, 20013, 98, 25991, 20449, 99, 24687, 100] # 此数列相当于 [ord(x) for x in list('a中b文信c息d')]
b = []
for s in sl:
if s < 128:
b.append([s])
else:
bl = 0
for i in range(1, 6): # 计算需要多少个字节
bl += 6
if s >> bl < 64:
c = i
break
bb = []
for i in range(c + 1):
num = s - (s >> ((i + 1) << 2) + ((i + 1) << 1) << ((i + 1) << 2) + ((i + 1) << 1)) >> (i << 2) + (i << 1) # 求每字节后6位
if i < c:
num += 128 # 除首字节外,每字节前两位为“10”
else:
num += sum(1 << j for j in range(c + 1)) << (7 - c) # 计算首字节前几位
bb.insert(0, num) # 注意是前插入
b.append(bb)
print(b) # 上面append改为extend,然后按单字节输出就是UTF-8,append只是为了结果的数字直观
# 下面的运算相当于 [ord(x) for x in list('a中b文信c息d')]
s = [97, 228, 184, 173, 98, 230, 150, 135, 228, 191, 161, 99, 230, 129, 175, 100] # 此数列相当于 list('a中b文信c息d'.encode('utf-8'))
b = []
while len(s) > 0:
if s[0] < 128:
b.append(s[0])
del s[0]
else:
head = 2
bl = 0
for i in range(2, 7): # 计算组成单个字符的连续utf-8字节数
bl += 6
head += 1 << i
if s[0] >> 7 - i == head:
c = i
break
num = s[0] - (head << 7 - c) << bl # 首字节转为数字
for i in range(1, c):
bl -= 6
num += s[i] - 128 << bl # 将其后每字节后6位(舍弃首两位“10”)累加
b.append(num)
del s[0:c]
print(b) # 每个整数按4字节输出就相当于UTF-32BE