【问题标题】:How to translate hexadecimal code to binary code? [closed]如何将十六进制代码转换为二进制代码? [关闭]
【发布时间】:2013-06-25 17:38:30
【问题描述】:

我已经阅读了很多资料,但我仍然对如何计算它感到困惑。 我正在做一个练习,询问:

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

0x30c0
0x303C
0xE0ADAA
0x3AA

【问题讨论】:

  • 什么让你困惑?将十六进制转换为二进制或 UTF-8 是如何工作的?
  • 我对如何翻译如 0x303c 感到困惑
  • C 被翻译成 1100 然后 3 是 11 然后 0 是 0 然后 x 是 1011 那么为什么答案是 11000000111100 Joni

标签: python utf-8 binary hex


【解决方案1】:

第一个定义:UTF-8 将 Unicode 代码点编码为 1 到 6 个字节的序列。

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

>>> seq = b"\x30\xC0"
>>> seq
b'0\xc0'

假设这可能是一个 UTF-8 编码的字节流,我们可以试试decode 方法:

>>> 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

???不工作。该序列不是正确的 UTF-8。


让我们为下一个序列做同样的事情:

>>> seq = b"\x30\x3C"
>>> seq.decode("UTF-8")
'0<'

啊,啊!没有例外。这是正确的 UTF-8,对应于 2 个代码点的字符串 0&lt;


第三个很有趣:

>>> seq = b"\xE0\xAD\xAA"
>>> seq.decode("UTF-8")
'୪'
>>> len(seq.decode("UTF-8"))
1

这 3 个字节仅用于编码一个代码点。 但这是哪个字符……嗯……“代码点”? Python 有 ord 函数知道:

>>> ord(seq.decode("UTF-8"))
2922

代码点 2922(十进制)。那是十六进制...

>>> "{: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'

原来如此:这是digit 4 in Oriya writing system对应的代码点。

【讨论】:

  • @ErikaSawajiri 我已经扩展了我的答案,向您展示如何提取 unicode 字符的代码点以及如何查询 Unicode 数据库以获得与字符相对应的正式名称。
  • Sylvain 非常感谢你!! ~
【解决方案2】:

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

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
>>> 

【讨论】:

  • 我已经编辑过了!非常感谢;)
猜你喜欢
  • 2019-01-01
  • 2015-08-01
  • 2014-01-15
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 2017-02-04
相关资源
最近更新 更多