1.各个类型占用字节数
1.bit(位): 二进制数中的一个数位,可以是0或者1,是计算机中数据的最小单位。二进制的一个“0”或一个“1”叫一位
2.Byte(字节): 计算机中数据的基本单位,每8位组成一个字节
int8: 8位,就是一个字节 [-128,127] 非符号 [0,255]
int16: 2个字节 [-32768,32767] 非符号 [0,65535]
int32: 4个字节 [-2147483648,2147483647] 非符号 [0,4294967295]
int64:8个字节 [-9223372036854775808,9223372036854775807]
float32: 4个字节
float64: 8 个字节
int 比较特殊,占用多大取决于你的cpu
32位cpu 就是 4个字节
64位 就是 8 个字节
float32: 4个字节
float64:8个字节
string
英文的ascii的string 1个英文字符或英文标点占1byte
中文的string 一个文字占用 3 byte
bool: 占用1byte
2. 组装其他类型压入字节缓冲
// 声明一个 buffer
dataBuff := new(bytes.Buffer)
//dataBuff := bytes.NewBuffer(make([]byte, 0,22))
var lens int64 // 占用8个字节
lens = 4
// 将 int64 写入 buffer
if err := binary.Write(dataBuff,binary.LittleEndian,lens);err != nil {
t.Log(err)
return
}
lens = 5
//将 int64 写入 buffer
if err := binary.Write(dataBuff,binary.LittleEndian,lens);err != nil {
t.Log(err)
return
}
// data写入数据中 buffer 两个中文字占用6个字节
if err := binary.Write(dataBuff,binary.LittleEndian,[]byte("你好"));err != nil {
t.Log(err)
return
}
b := dataBuff.Bytes()
t.Log("长度:",len(b)) (8+8+6) = int64 + int64 + string
输出结果:
长度: 22
3.byte 解包
// 解包
dataReader := bytes.NewReader(b)
var f int64
// 低尾 取出 第一个8个字节的int64
if err := binary.Read(dataReader,binary.LittleEndian,&f);err != nil {
t.Log(err)
return
}
t.Log("打印1",f)
// 低尾 取出 第二个8个字节的int64
if err := binary.Read(dataReader,binary.LittleEndian,&f);err != nil {
t.Log(err)
return
}
t.Log("打印2",f)
// 取出string 对应的字节
ts := b[16:]
ts2 := []rune(string(ts)) // int32 len(ts2) == 2 []byte []rune
t.Log("打印3",ts,ts2)
// 转二进制 1个字节对应8bit
s := biu.BytesToBinaryString(ts)
t.Log(s)
输出结果
datapack_test.go:159: 打印1 4
datapack_test.go:165: 打印2 5
datapack_test.go:172: 打印3 [4 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0] [229 190 144 232 181 158] [24464 36190]
datapack_test.go:176: [11100101 10111110 10010000 11101000 10110101 10011110]