go语言判断字节序 golang字节数组

golang unicode/utf8源码分析包 utf-8 实现的功能和常量用于文章utf8编码,包含runes和utf8字节序列的转换功能.在unicode中,一个中文占两个字节,utf-8中一个中文占三个字节,golang默认的编码是utf-8编码 , 因此默认一个中文占三个字节 , 但是golang中的字符串底层实际上是一个byte数组.
Output:
RuneSelf该值的字节码值为128,在判断是否是常规的ascii码是使用 。hicb字节码值为191. FF 的对应的字节码为255 。
计算字符串中的rune数量,原理:首先取出字符串的码值 , 然后判断是不是个小于128的,如果是小于则直接continue.rune个数++.
如果是个十六进制f1.的则是无效字符,直接continue.rune个数++,也就是说一个无效的字符也当成一个字长为1的rune.如果字符的码值在first列表中的值和7按位的结果为其字长,比如上面示例中的 钢。其字长为三位,第一位的值为 233 .二进制形式为 11101001 ;与7按位与后的值为0.从acceptRanges中取出的结果为{locb, hicb} 。也就是标识 ox80 到 0xbf 之间的值 。而结果n也就是直接size+3跳过3个字节后,rune个数++ 。其他函数的处理流程差不多 , 不再过多叙述 。
示例:
ValidString返回值表明参数字符串是否是一个合法的可utf8编码的字符串 。
RuneCount返回参数中包含的rune数量,第一个例子中将 utf8.RuneCountInString ,改成该方法调用 , 返回的结果相同 。错误的和短的被当成一个长一字节的rune.单个字符 H 就表示一个长度为1字节的rune.
该函数标识参数是否以一个可编码的rune开头,上面的例子中,因为字符串是以一个ascii码值在0-127内的字符开头,所以在执行
first[p[0]] 时,取到的是 p[0] 是72,在first列表中,127之前的值都相同都为 0xF0 ,十进制标识为240 , 与7按位与后值为0,所以,直接返回 true .
和FullRune类似,只是参数为字符串形式
golang之大端序、小端序当分别处于大小端模式下的内容存放如下
(1)大端模式存储(存储地址为16位)
地址数据
0x0004(高地址)0x44
0x00030x33
0x00020x22
0x0001(低地址)0x11
(2)小端模式存储(存储地址为16位)
地址数据
0x0004(高地址)0x11
0x00030x22
0x00020x33
0x0001(低地址)0x44
在前面也简单阐述了大小端序的定义并结合简单实例来说明,接下来会给出详细实例来说明:
1、大端序(Big-Endian):或称大尾序
一个类型: int32 的数 0X0A0B0C0D的内存存放情况
数据是以8bits为单位
2、小端序(little-endian):或称小尾序
比如0x00000001
大端序:内存低比特位 00000000 00000000 00000000 00000001 内存高比特位
小端序:内存低比特位 10000000 00000000 00000000 00000000 内存高比特位
其实在前面罗列出那么东西 , 最终是为了接下来讲述的在golang中涉及到网络传输、文件存储时的选择 。一般来说网络传输的字节序 , 可能是大端序或者小端序 , 取决于软件开始时通讯双方的协议规定 。TCP/IP协议RFC1700规定使用“大端”字节序为网络字节序 , 开发的时候需要遵守这一规则 。默认golang是使用大端序 。详情见golang中包encoding/binary已提供了大、小端序的使用
输出结果:
16909060 use big endian:
int32 to bytes: [1 2 3 4]### [0001 0002 0003 0004]
bytes to int32: 16909060
16909060 use little endian:
int32 to bytes: [4 3 2 1]### [0004 0003 0002 0001]
【go语言判断字节序 golang字节数组】bytes to int32: 16909060
在RPCX框架中关于RPC调用过程涉及的传递消息进行编码的,采用的就是大端序模式

推荐阅读