问题描述
好的,我知道如何将十进制转换为 8-bit
,例如字符“A”的十进制它是 65
将其转换为二进制非常简单
但是如果小数大于 255
例如阿拉伯字符 "م"
在十进制中它是 1605
,在二进制中它是 11001000101
当我在任何网站上转换它时,它显示 11011001 10000101
我想知道11001000101
如何11011001 10000101
解决方法
您的阿拉伯字符“م”的十进制代码点为 1605。十六进制是 0645h,二进制是 0000'0110'0100'0101b。
utf-8 编码将用 1 个字节表示代码点在 U+0000 到 U+007F 范围内的所有字符,使用下一个模板:
0_______
^
| 7 bits
utf-8 编码将用 2 个字节表示代码点在 U+0080 到 U+07FF 范围内的所有字符。您的阿拉伯字符“م”在此范围内位于 U+0645h。
当处理 2 个字节时,模板变成
110_____ 10______
^ ^
| | 6 bits
| 5 bits
在此模板中,我们填写代码点 11001'000101b 二进制表示的最低(仅)11 位:
110_____ 10______
^ ^
| 11001 | 000101
这产生二进制 110'11001'10'000101b
以下是 [U+128,U+2047] 中代码点转换的 x86 汇编版本:
<------ AX ------->
mov ax,1605 ; Your example: 0000 0110 0100 0101
/ /
/ / Shift left the whole 16 bits,twice
shl ax,2 0001 1001 0001 0100
\ \
\ \ Shift right the lowest 8 bits,twice
shr al,2 0001 1001 0000 0101
||| ||
||| || Put in the template bits
or ax,1100000010000000b 1101 1001 1000 0101
<- AH --> <-- AL ->
现在 AH
寄存器包含 utf-8 编码的第一个字节,AL
寄存器包含 utf-8 编码的第二个字节。
因为 x86 是一个小端架构,最低字节首先存储在内存中,xchg al,ah
指令将在将结果移动到内存之前修复字节的顺序:mov [somewhere],ax
。
看起来您正在使用 UTF-8 character encoding,在 Python 中,您可以执行以下操作:
>>> "_".join(f"{byte:08b}" for byte in "م".encode("utf8"))
'11011001_10000101'