• 一步
    2020-09-16
    替换出 UTF-8 编码对应的三个字节。在替换时,你需要将从上一步获得的二进制序列中的各个二进制位,按照从左到右的顺序依次替换掉 UTF-8 编码中用于占位的 “x” ======================= 这一步是怎么替换的? 没有看明白的 01100111 10000001 ---> 11100110 10011110 10000001

    作者回复: 首先,我们根据码位值找到表中的一个范围 [U+0800, U+FFFF]。然后这个范围对应着一个模板 “1110xxxx 10xxxxxx 10xxxxxx”,其中就有占位的 “x”。然后你再把上面的 “01100111 10000001” 从左到右按位依次替换到模板中的 “x”,就可以得到结果了。

    
    8
  • Geek_58a18e
    2020-09-27
    大学没学懂的知识 工作好几年后配上老师的教程 醍醐灌顶 感谢

    作者回复: 很高兴能够帮到你 :)

    
    2
  • 一步
    2020-09-16
    为什么要有那么多编码方式呢? 虽说每种编码方式都是针对的场景,但是还是没有个整体的概念。 要不老师来个加餐讲讲各种编码方式出现的历史背景和要解决的问提? 期待

    作者回复: 收到你的反馈哈,会考虑的。其实对于编码你可以这样简单理解:人们通常都喜欢与文本打交道,比如字母、字符,甚至汉字等等。但是计算机只能跟 “1” 和 “0” 打交道。而“编码”就是为了将这些人类可读的“文本”依据某种规则和方式转换为 “1” 和 “0” 的序列这样的一个过程。

    共 2 条评论
    2
  • Twittytop
    2022-04-25
    ”其左侧填充指定的二进制位来增加整个有符号数的总位数,并同时保证该二进制数本身的值不会被改变。“这句话中并同时保证该二进制数本身的值不会被改变是什么意思?是说左侧填充了符号位之后本身的值没改变?好像不对,还是左侧位填充1,其他的不变? 另外为什么要是7的倍数,是这个编码方式就是这么规定的吗?

    作者回复: 1. 这里我们做的实际上就是“符号扩展”,按照最高位符号位的情况来进行位填充。也就是如果符号位是 1,那就填充 1,否则填充 0。这样就可以保证填充后整个数字的值不会发生改变。 2. 是的。实际上这里的 7 是跟 LEB128 的编码规则有关的,2^7 也就是 128。

    
    
  • 张宗伟
    2021-12-05
    有符号数 “-654321” 在 varint32 类型下的可能编码值之一是:0x58、0x88、0x8f。 想请问一下老师,如果出现了占位的 0x80 或 0xff 应该怎么计算呢?有知道的小伙伴也可以说下,谢谢!

    作者回复: 你的问题是说从含有填充字节的编码值计算原值?

    共 2 条评论
    
  • champ
    2021-01-17
    -654321 原码: 1 1001 1111 1011 1111 0001 反码: 1 0110 0000 0100 0000 1110 补码: 1 0110 0000 0100 0000 1111 符号扩展:(无需扩展) 1 0110 0000 0100 0000 1111 分组: 1011000 0001000 0001111 填充: 01011000 10001000 10001111 16进制表示: 0x58 0x88 0x8f
    共 1 条评论
    2
  • vividlipi
    2020-10-03
    第一步: -654321:第一个1表示符号位,补码表示是:101100000010000001111 第二步: 有符号拓展扩展到7的倍数: 1011000 0001000 0001111 第三步: 分组填充: 01011000 10001000 10001111 第四步: 0x58 0x88 0x8f
    
    2
  • becky
    2023-08-11 来自浙江
    除了0x58 0x88 0x8f,“-654321”是也可以将数字值扩展为32位后再编码吧,编码后是0x7f 0xff 0xd8 0x88 0x8f
    
    