【问题标题】:What does "bits 6-0" or "bits 10-6 " mean in the javadoc of DataInput?DataInput 的 javadoc 中的“bits 6-0”或“bits 10-6”是什么意思?
【发布时间】:2021-03-05 07:22:42
【问题描述】:

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

我是 Java 新手,所以对我来说它看起来像减法,不确定,但如果是这种情况,我们将它添加到 1 和 0 中,它会产生 7 位。 据我所知,一个字节由8位组成。

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

【问题讨论】:

  • 它表示一个范围,但它看起来“颠倒了”,因为它使用从最高有效数字/位到次有效数字/位的索引。因此,如果您有单个 byte 代表 8 位,例如 10101111,我们可以为它分配索引,例如 [7][6][5][4][3][2][1][0]。那么所有数字的范围是7-0,它将代表位10101111。 6-2 之类的范围将是01011 部分等。如果char 是 16 位(2 个字节),索引将在 15-0 范围内(第一个字节的范围 15-8;第二个字节的范围 7 -0)。

标签: java utf-8


【解决方案1】:

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 艺术感到抱歉,希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      该表正在讨论如何在修改后的 UTF8 编码中表示字符。我将以这部分为例:

      空字符“\u0000”和“\u0080”到“\u07FF”范围内的字符由一对字节表示。

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

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

      第一个字节以 110 位开始(这三个位是固定的),接下来是我们试图表示的数字的 bit-10、bit-9、bit-8、bit-7、bit-6。

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

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

      我鼓励您将此与普通的UTF8 编码进行比较,看看有什么不同。

      【讨论】:

        猜你喜欢
        • 2019-05-30
        • 2023-04-07
        • 2022-08-14
        • 2013-06-13
        • 2020-11-30
        • 2019-08-30
        • 2014-03-10
        • 2016-07-14
        • 2022-11-19
        相关资源
        最近更新 更多