Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将十六进制代码翻译成二进制代码?_Python_Utf 8_Binary_Hex - Fatal编程技术网

Python 如何将十六进制代码翻译成二进制代码?

Python 如何将十六进制代码翻译成二进制代码?,python,utf-8,binary,hex,Python,Utf 8,Binary,Hex,我已经阅读了很多资料,但我仍然不知道如何计算它。 我正在做一个练习,要求: 以下哪一位序列(以十六进制数字表示)表示有效的UFT-8字符串?如果它们是有效的UTF-8字符串,该位序列对应多少代码 0x30c0 0x303C 0xE0ADAA 0x3AA 第一个定义:将Unicode代码点编码为1到6个字节的序列 0x30C0使用十六进制表示法表示2个字节。假设高阶字节首先出现在字节序列中,这相当于0x30后跟0xC0。可以用Python 3编写: >>> seq = b"\x

我已经阅读了很多资料,但我仍然不知道如何计算它。 我正在做一个练习,要求:

以下哪一位序列(以十六进制数字表示)表示有效的UFT-8字符串?如果它们是有效的UTF-8字符串,该位序列对应多少代码

0x30c0
0x303C
0xE0ADAA
0x3AA
第一个定义:将Unicode代码点编码为1到6个字节的序列

0x30C0使用十六进制表示法表示2个字节。假设高阶字节首先出现在字节序列中,这相当于0x30后跟0xC0。可以用Python 3编写:

>>> seq = b"\x30\xC0"
>>> seq
b'0\xc0'
假设这可能是UTF-8编码的字节流,我们可以尝试
解码方法:

>>> seq.decode("UTF-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 1: invalid start byte
这3个字节仅用于编码一个代码点。 但是哪个角色。。。哼这是“代码点”吗?Python有
ord
函数来了解:

>>> ord(seq.decode("UTF-8"))
2922
代码点2922(décimal)。那是十六进制的

>>> "{:04X}".format( ord(seq.decode("UTF-8")) )
'0B6A'
因此字节序列
0xE0 0xAD 0xAA
编码为UTF-8 unicode码点
U+0B6A
。那是哪个角色?Python嵌入模块以查询Unicode数据库:

>>> import unicodedata
>>> unicodedata.name( seq.decode("UTF-8") )
'ORIYA DIGIT FOUR'

就是这样:这是对应的代码点。

这个问题提出得非常糟糕。这些都是数字,不是字符串。我怀疑这意味着表示字节序列,在这种情况下,他们应该将其写成:

0x30 0xc0
0x30 0x3C
0xE0 0xAD 0xAA
0x03 0xAA
…或者类似的东西

如果这是问题的实际意思(不清楚),那么可以通过琐碎的检查看出哪些是无效的UTF-8:

  • 第一个是无效的。字节
    0xc0
    从来都不是有效的UTF-8
  • 第二个仅包含ASCII,因此根据定义,它也是有效的UTF-8
  • 第三个字节的格式乍一看是正确的(第一个字节大于0xc1,第二个和第三个字节介于0x80和0xbf之间)。您可以按照UTF-8的定义,用纸和笔对其进行解码,并查看其是否有效
  • 第四个无效:它有一个连续字节
    0xaa
    ,但没有多字节序列的有效第一个字节
,您可以尝试让计算机对其进行解码,它将为无效的代码提供一个错误。例如,使用Python版本3

>>> bytes([0x30,0xc0]).decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 1: invalid start byte
>>> bytes([0x30,0x3c]).decode('utf-8')
'0<'
>>> bytes([0xe0,0xad,0xaa]).decode('utf-8')
'୪'
>>> bytes([0x03,0xaa]).decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xaa in position 1: invalid start byte
>>> 
>>字节([0x30,0xc0])。解码('utf-8')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
UnicodeDecodeError:“utf-8”编解码器无法解码位置1中的字节0xc0:无效的开始字节
>>>字节([0x30,0x3c])。解码('utf-8')
'0>> 

什么让你困惑?将十六进制转换为二进制或UTF-8是如何工作的?我对如何翻译感到困惑,例如0x303cC被翻译成1100,然后3是11,然后0是0,然后x是1011,那么为什么答案是1100000011100?JoniI编辑过这个!非常感谢;)@ErikaSawajiri我扩展了我的答案,向您展示了如何提取unicode字符的代码点,以及如何查询unicode数据库以使正式名称与字符相对应。非常感谢~
0x30 0xc0
0x30 0x3C
0xE0 0xAD 0xAA
0x03 0xAA
>>> bytes([0x30,0xc0]).decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 1: invalid start byte
>>> bytes([0x30,0x3c]).decode('utf-8')
'0<'
>>> bytes([0xe0,0xad,0xaa]).decode('utf-8')
'୪'
>>> bytes([0x03,0xaa]).decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xaa in position 1: invalid start byte
>>>