DataInput 的javadoc 中的"bits 6-0" 或"bits 10-6 " 是什么意思?

What does "bits 6-0" or "bits 10-6 " mean in the javadoc of DataInput?

阅读时the javadoc of DataInput specifically in the "Modified UTF-8" section。我遇到了三个表,上面写着“0 位 6-0”,“1 1 0 位 10-6”,...,“1 0 位 5-0”。

我是一个 Java 新手,所以对我来说它看起来像是减法,不确定,但如果是这样的话,我们将它加到 1 和 0 上,它将得到 7 位。 据我所知,一个字节由8位组成。

这些“0 位 6-0...”是什么意思?

javadoc 告诉你每个字节是如何划分的。

将每个字节视为 8 个单独元素(位)的向量。

第一个块只有一个字节,对应的可能位值。

byte 1

bit number 7 6 5 4 3 2 1 0
bit value  0 ? ? ? ? ? ? ? <-- bits 6 - 0

这意味着对于一个字节编码的字符,前导位将始终为0。这些是从\u0001\u007F的字符。

第二个块有两个字节,有点复杂

byte 1                       byte 2

bit number 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0
bit value   1  1  0  ?  ?  ? ? ? | 1 0 ? ? ? ? ? ?
                          ^                 ^
                          |                 |
                   bits 10 to 6 of       bits 5 to 0 of
                 the utf-8 codepoint    the utf-8 codepoint

这些是 \u0080\u07FF

范围内的字符

因此,例如,此范围内的符号是 µ(微符号)。

在普通的 unicode 中,字节是 11000010 10110101

看看这个字符,看看它如何与双字节字符的位对齐。你有

15 14 13 12 11 10 9 8    7 6 5 4 3 2 1 0
 1  1  0  0  0  0 1 0    1 0 1 1 0 1 0 1

Bits 10-6 ------*-*-*----*-* ^-^-^-^-^-^----bits 5-0

你最终得到

byte 1                       byte 2

bit number 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0
bit value   1  1  0  -  -  0 1 0 | 1 0 1 1 0 1 0 1

字节 11 和 12 应该是 0 但我放了一个 - 只是为了显示它们的(不)重要性。

抱歉,ascii 艺术,希望对您有所帮助。

它显示位的范围。位被编号,最低位、最低位的索引为 0,下一位的索引为 1,下一位的索引为 2 等。例如,数字 13 的二进制表示为 1101。这意味着第 0 位的值为 1,位数字 1 的值为 0,第 2 位和第 3 位的值为 1。因此,例如,在文档中,“0 位 6-0”表示字节中的最高位必须为零,而低 7 位则为从6到0的索引都被你的号码占用了

table 是在讨论字符在修改后的 UTF8 编码中的表示方式。我将以这部分为例:

The null character '\u0000' and characters in the range '\u0080' to '\u07FF' are represented by a pair of bytes.

请注意,您可以使用 11 位来表示这些数字。您可以用 11 位表示的最大数字是 2^11 - 1 = 2047 = 7FF(十六进制)。让我们将这 11 位编号为 0 到 10,因此 bit-10 是最高有效位,bit-0 是最低有效位。

table 告诉您,在修改后的 UTF8 编码中,这些数字的编码字符改为由 2 个字节表示。

第一个字节以第 110 位开始(这三个位是固定的),然后是我们要表示的数字的第 10 位、第 9 位、第 8 位、第 7 位、第 6 位.

第二个字节从第10位开始(这两位是固定的),接着是数字的bit-5、bit-4、bit-3、bit-2、bit-1、bit-0。

简而言之,“bits 10-6”的意思是“bits 10 6”,不是4位,而是5位.

我鼓励您将其与正常的 UTF8 编码进行比较,看看有什么不同。