gpt4 book ai didi

python: UnicodeDecodeError: 'utf8' 编解码器无法解码位置 0 中的字节 0xc0:起始字节无效

转载 作者:太空狗 更新时间:2023-10-30 00:55:52 25 4
gpt4 key购买 nike

我正在尝试编写一个脚本,通过创建随机 utf-8 编码字符串然后将其解码为 un​​icode 来生成随机 unicode。对于单个字节它工作正常,但对于两个字节它会失败。

例如,如果我在 python shell 中运行以下命令:

>>> a = str()

>>> a += chr(0xc0) + chr(0xaf)

>>> 打印 a.decode('utf-8')

UnicodeDecodeError: 'utf8' codec can't decode byte 0xc0 in position 0: invalid start byte

根据utf-8方案https://en.wikipedia.org/wiki/UTF-8#Description字节序列 0xc0 0xaf 应该有效,因为 0xc0110 开头,而 0xaf10< 开头.


这是我的 python 脚本:

def unicode(self):
'''returns a random (astral) utf encoded byte string'''
num_bytes = random.randint(1,4)
if num_bytes == 1:
return self.gen_utf8(num_bytes, 0x00, 0x7F)
elif num_bytes == 2:
return self.gen_utf8(num_bytes, 0xC0, 0xDF)
elif num_bytes == 3:
return self.gen_utf8(num_bytes, 0xE0, 0xEF)
elif num_bytes == 4:
return self.gen_utf8(num_bytes, 0xF0, 0xF7)

def gen_utf8(self, num_bytes, start_val, end_val):
byte_str = list()
byte_str.append(random.randrange(start_val, end_val)) # start byte
for i in range(0,num_bytes-1):
byte_str.append(random.randrange(0x80,0xBF)) # trailing bytes
a = str()
sum = int()
for b in byte_str:
a += chr(b)
ret = a.decode('utf-8')
return ret

if __name__ == "__main__":
g = GenFuzz()
print g.gen_utf8(2,0xC0,0xDF)

最佳答案

这确实是无效的 UTF-8。在 UTF-8 中,只有 U+0080 到 U+07FF 范围内的代码点(含)可以使用两个字节进行编码。更仔细地阅读维基百科文章,您会看到同样的事情。因此,字节 0xc0 可能永远不会出现在 UTF-8 中。 0xc1 也是如此。

一些 UTF-8 解码器错误地将 C0 AF 等序列解码为有效的 UTF-8,这在过去导致了安全漏洞。

关于python: UnicodeDecodeError: 'utf8' 编解码器无法解码位置 0 中的字节 0xc0:起始字节无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23772144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com