Skip to content

20201205关于encoding.binary hex json的探讨(2)

ziyouzy edited this page Dec 5, 2020 · 1 revision

其实binary、hex、json的共同点,或者说核心工作环节是:

他们都是基于数据的raw状态来进行工作的:

比如:

把一个“临时类型”(如int,无论是10进制,16进制、string(utf8协议to2进制协议))---binary包
把一个“临时类型”(如int,   无论是10进制,2进制、string(utf8协议to16进制协议))---hex包
把一个“临时类型”(结构体“协议”to"json规范协议”)---json包

如果想进行反向操作,也就必须是通过raw来进行后续操作了

这个知识点的核心在于,补齐知识点缺失的一块“拼图”也就是语言自身帮程序员隐式实现的编码转换工作环节,这也是所有不同语言共通的

举例:

json的结构体“协议”to"json规范协议"

等同于

string类型的string“协议”to二进制大端字节序协议

或者说,任何变量类型都是自带协议的,如string,int,float等等,这里的string协议即是utf8协议

binary、hex、json的存在意义在于,实现协议与协议间的相互转换,只不过不得不基于一个储存媒介来进行,也就是raw

只不过raw的储存形式刚好满足了属于binary的二进制大端字节序协议而已,转换与储存是完全不同的两件事:

src := []byte("abc123") // 准备数据
dst := make([]byte,hex.EncodedLen(len(src))) // 计算转换为16进制后的长度
hex.Encode(dst,src) // 转码

第一部虽说进行的是string到raw的转化,其实也实现了stirng到二进制大端字节序协议整形的转换,这个事件拥有双重属性

当src拿到后,他同样拥有双重属性,他即能代表raw,也能代表一个二进制大端字节序协议的整形,这里只会在乎后者

于是之后进行了二进制到16进制的转换,而dst则真正只代表了raw的属性与意义,但他同样是一个二进制大端字节序协议,只不过没必要再去进行重复的操作了

一切都变得清晰明了了

Clone this wiki locally