【转】go语⾔中int和byte转换⽅式
-------------------------------
主机字节序
主机字节序模式有两种,⼤端数据模式和⼩端数据模式,在⽹络编程中应注意这两者的区别,以保证数据处理的正确性;例如⽹络的数据是以⼤端数据模式进⾏交互,⽽我们的主机⼤多数以⼩端模式处理,如果不转换,数据会混乱参考;⼀般来说,两个主机在⽹络通信需要经过如下转换过程:主机字节序 —> ⽹络字节序 -> 主机字节序
⼤端⼩端区别
⼤端模式:Big-Endian就是⾼位字节排放在内存的低地址端,低位字节排放在内存的⾼地址端
低地址 --------------------> ⾼地址
⾼位字节地位字节
⼩端模式:Little-Endian就是低位字节排放在内存的低地址端,⾼位字节排放在内存的⾼地址端
低地址 --------------------> ⾼地址
低位字节⾼位字节
什么是⾼位字节和低位字节
例如在32位系统中,357转换成⼆级制为:00000000 00000000 00000001 01100101,其中
00000001 | 01100101
⾼位字节低位字节
int和byte转换
在go语⾔中,byte其实是uint8的别名,byte 和 uint8 之间可以直接进⾏互转。⽬前来只能将0~255范围的int转成byte。因为超出这个范
围,go在转换的时候,就会把多出来数据扔掉;如果需要将int32转成byte类型,我们只需要⼀个长度为4的[]byte数组就可以了
⼤端模式下
1
2
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27func f2() {
var v2 uint32
var b2 [4]byte
v2 = 257
// 将 257转成⼆进制就是
// | 00000000 | 00000000 | 00000001 | 00000001 |
// | b2[0] | b2[1] | b2[2] | b2[3] | // 这⾥表⽰b2数组每个下标⾥⾯存放的值 // 这⾥直接使⽤将uint32强转成uint8
// | 00000000 0000000 00000001 | 00000001 直接转成uint8后等于 1
// |---这部分go在强转的时候扔掉---|
b2[3] = uint8(v2)
// | 00000000 | 00000000 | 00000001 | 00000001 | 右移8位转成uint8后等于 1
// 下⾯是右移后的数据
// | | 00000000 | 00000000 | 00000001 |
b2[2] = uint8(v2 >> 8)
// | 00000000 | 00000000 | 00000001 | 00000001 | 右移16位转成uint8后等于 0 // 下⾯是右移后的数据
// | | | 00000000 | 00000000 |
b2[1] = uint8(v2 >> 16)
// | 00000000 | 00000000 | 00000001 | 00000001 | 右移24位转成uint8后等于 0 // 下⾯是右移后的数据
// | | | | 00000000 |
go语言字符串转数组b2[0] = uint8(v2 >> 24)
fmt.Printf("%+v\n", b2)
// 所以最终将uint32转成[]byte数组输出为
// [0 0 1 1]
}
⼩端模式下1
2
3 4 5// 在上⾯我们讲过,⼩端刚好和⼤端相反的,所以在转成⼩端模式的时候,只要将[]byte数组的下标⾸尾对换⼀下位置就可以了func f3() {
var v3 uint32
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 var b3 [4]byte
v3 = 257
// 将 256转成⼆进制就是
// | 00000000 | 00000000 | 00000001 | 00000001 |
// | b3[0] | b3[1] | b3[2] | [3] | // 这⾥表⽰b3数组每个下标⾥⾯存放的值
// 这⾥直接使⽤将uint32l强转成uint8
// | 00000000 0000000 00000001 | 00000001 直接转成uint8后等于 1
// |---这部分go在强转的时候扔掉---|
b3[0] = uint8(v3)
// | 00000000 | 00000000 | 00000001 | 00000001 | 右移8位转成uint8后等于 1 // 下⾯是右移后的数据
// | | 00000000 | 00000000 | 00000001 |
b3[1] = uint8(v3 >> 8)
// | 00000000 | 00000000 | 00000001 | 00000001 | 右移16位转成uint8后等于 0 // 下⾯是右移后的数据
/
/ | | | 00000000 | 00000000 |
b3[2] = uint8(v3 >> 16)
// | 00000000 | 00000000 | 00000001 | 00000001 | 右移24位转成uint8后等于 0 // 下⾯是右移后的数据
// | | | | 00000000 |
b3[3] = uint8(v3 >> 24)
fmt.Printf("%+v\n", b3)
// 所以最终将uint32转成[]byte数组输出为
// [1 1 0 0 ]
}
go转换demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16//整形转换成字节
func IntToBytes(n int) []byte {
x := int32(n)
bytesBuffer := bytes.NewBuffer([]byte{})
binary.Write(bytesBuffer, binary.BigEndian, x) return bytesBuffer.Bytes()
}
//字节转换成整形
func BytesToInt(b []byte) int {
bytesBuffer := bytes.NewBuffer(b)
var x int32
binary.Read(bytesBuffer, binary.BigEndian, &x) return int(x)
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论