如何将大于 255 的十进制数转换为两个 8 位2 字节

问题描述

好的,我知道如何将十进制转换为 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'