白话编码:让十六进制“说人话”

背景

为某客户做信锐AC监控,AC下纳管的AP名字显示为16进制字串(形如“E5 95 86 E5 8A A1 E9 83 A8”),客户反馈看不懂其代表的含义。

原因

如果AP的名字没有更改,那么通过snmp获取到的AP名字是mac地址;如果更改了那么获取的是UTF-8编码的16进制数。

矛盾出现了,如果AP名字被更改过那么理应做转化,而如果AP名字未被更改那么不应该做转化。于是研发人员就将这个工作交给了实施团队----根据实际情况增加转化。

解决

历史上有近10个客户用到了信锐AC,都是在实施过程中识别和转化的,那有没有办法在代码里兼容转化呢?答案是可以的。

因为UTF-8编码有固定规则,完全可以区分16进制数是mac地址还是UTF编码,具体代码不赘述了。但有的同学提起来ascii、gbk、gb2312、utf、16进制就抓瞎,所以把涉及到的一些编码知识在团队内总结普及下。

知识点拓展

(1)16进制:
他就是一个数字的呈现形式,这个真的不能再解释了。数字10,16进制表示就是A,二进制表示就是1010。
在这里插入图片描述

(2)ASCII码:
1960年代美国制定的字符编码,将英文字符与二进制对应起来。举例来说16进制30代表数字0、61代表英文字母A。

(3)Unicode:
英文字符不能打遍全球啊,全球有那么多文字,而计算机却只认识数字。以“我”这个字为例,如果没有一个统一的表示方式,你用AA表示(仅举例),他用BB表示“我”,那计算机岂不是要疯了。于是unicode出现了,它是个非常大的集合,把世界上所有的文字都定义了唯一的数字表示方式。注意它定义的是“文字”与“数字”的对应关系,就是把“我”这个字给个唯一标志的数字“AAAA“(仅为举例)。

(4)Unicode的问题:
unicode既然表示了全量的文字看起来非常好,但实际上它并不能普及。第一个问题就是它不能识别一串数字到底表示几个字符。举个例子,在unicode的码表中,二进制0100 1111 0110 0000如果表示一个字符的话,是汉字 “你”,但如果表示2个字符的话是英文字符O(0100 1111)和 `(0110 0000),这让计算机怎么搞?那有人说,为了解决第一个问题我可以把英文字符前面补0,让他也成为2字节,比方说我把O变成0000 0000 0100 1111。这样每个文字都是2字节表示长度就统一了,计算机每次读取2个字节然后判断不就行了?理想很丰满现实很骨感,这样做的话那存储空间、网络传输带宽都会膨胀,而且如果是4字节呢,是不是浪费更多的0来补位,所以unicode最终并未落实为编码方式,而是表示方式。

(5)UTF:
随着互联网的普及,一种统一的UTF编码方式出现了,它真正的把unicode表示方式给转换成了实用的编码方式。那么它是怎么解决unicode的长度表示问题和资源浪费问题的呢?核心在于它变长表示法,他可以用1~4个字节表示一个文字,其编码规则只有两条:

a) 单字节的文字:
第一位是0,后面7位是unicode码。所以对于英文单字符来说,utf和ascii是一样的

b) 多字节的文字(N字节):
先把文字用unicode表示法记录成二进制,然后把这串二进制依次塞进如下格式的二进制串:第一个字节前面的N位全是1、第N+1位是0,剩下的8-N-1位补unicode的字串,后面的字节前两位全是10,剩下的6位补unicode的字串。对应关系如下:
在这里插入图片描述

c)举例
找个网站(例如https://www.wetools.com/unicode)查下"你"的unicode是4F60(0100 1111 0110 0000)。要用utf编码的话,它落在0800~FFFF之间,应该用3个字节表示。

开始填充 1110 0100 1011 1101 1010 0000 。具体对应关系如下图所示:
在这里插入图片描述

最终形成的数字是1110 0100 1011 1101 1010 0000 16进制E4BDA0。找个网站把UTF转成中文(例如https://www.bejson.com/convert/ox2str/#google_vignette)

题外话

一定要理解unicode是个啥,它是文字的唯一数字化表示方式,也叫码点(code point)。

然后再理解utf是个啥,它是把unicode码点做转换,从而让其在网络传输、文件保存等场景中没有歧义的编码方式,它编出来的码和unicode的码不一样,目的就是为了解决表示二义性、存储传输效率问题的。

同理,其他编码方式也基本一样,例如ucs2是双字节编码,就是用2个字节来表示unicode的唯一文字;Ucs4是4字节编码,用4个字节表示unicode的唯一文字。
在这里插入图片描述

  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue的底层原理可以用以下几个关键点来解释: 1. 响应式数据:Vue使用了响应式数据的机制,通过Object.defineProperty()方法来劫持对象的属性,当属性发生变化时,会触发相应的更新操作。 2. 虚拟DOM:Vue使用虚拟DOM来提高渲染性能。当数据发生变化时,Vue会先生成一个虚拟DOM树,然后通过比较新旧虚拟DOM树的差异,最终只更新需要更新的部分,减少了对真实DOM的操作次数。 3. 模板编译:Vue的模板编译过程将模板转换为渲染函数,渲染函数可以生成虚拟DOM树。在编译过程中,Vue会解析模板中的指令和插值表达式,并生成相应的渲染函数。 4. 组件化开发:Vue将页面拆分为多个组件,每个组件都有自己的状态和视图。组件之间可以通过props和事件进行通信,使得代码更加模块化和可复用。 5. 生命周期:Vue组件有不同的生命周期钩子函数,可以在不同的阶段执行相应的操作,例如在组件创建前、创建后、更新前、更新后等。 6. 指令系统:Vue提供了一系列的指令,例如v-bind、v-if、v-for等,用于在模板中添加特定的行为和逻辑。 7. MVVM模式:Vue采用了MVVM(Model-View-ViewModel)模式,将视图和数据进行双向绑定。当数据发生变化时,视图会自动更新;当用户操作视图时,数据也会自动更新。 8. 插件系统:Vue提供了插件系统,可以通过插件扩展Vue的功能。插件可以添加全局方法或者指令,也可以扩展Vue实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值