【发布时间】:2021-11-13 17:11:19
【问题描述】:
我正在尝试编写一个函数,该函数采用十进制并将其以相反的顺序转换为十六进制转义序列。我编写的代码适用于大多数数字,例如示例中的代码,但是随机地,它在开头添加了一个额外的字节 \xC2 或 \xC3。我认为这是因为 utf-8 的工作方式有一种特殊的方式,但需要它恰好有 4 个字节。从测试来看,它似乎每隔 128 个数字发生一次,它从该部分的半点开始切换到 \xC3
我可以系统地删除添加的额外字节,但这似乎是随机的,必须有更好的方法来做到这一点那么这个随机额外字节背后的原因是什么以及我如何防止它发生,或者我应该系统地删除它吗
这是我写的函数:
def convert_int_to_reverse_hex_escape_sequence(decimal):
# example of the variable in comments # decimal = 275
hexadecimal = hex(decimal) # 0x113
padded = hexadecimal[2:].zfill(8) # 00000113
array = re.findall('..', padded) # ['00', '00', '01', '13']
array.reverse() # ['13', '01', '00', '00']
unicode = ''.join([chr(int(x, 16)) for x in array]).encode('utf-8') # b'\x13\x01\x00\x00'
return unicode
【问题讨论】:
-
import struct; struct.pack('<i', 275)与您的功能几乎相同? -
哪个数字不能正常工作?
-
顺便说一句,您不需要转换为十六进制,只需提取字节即可。 (模块256或带移位功能)。但问题是:代码从 0 到 127 的字符被编码为从 0 到 127 的字节。但是代码点高于 127 的字符以 2(或更多字节)的 unicode 编码。你应该关心语义(Unicode 是关于给代码点(索引)赋予意义)。
-
你绕了一大圈。但是,如果您使用
'latin-1'而不是'utf-8'进行编码,则可以使其正常工作。