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数组就可以了
⼤端模式下
func 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 |
b2[0] = uint8(v2 >> 24)
fmt.Printf("%+v\n", b2)
/
/ 所以最终将uint32转成[]byte数组输出为
// [0 0 1 1]
}
⼩端模式下
// 在上⾯我们讲过,⼩端刚好和⼤端相反的,所以在转成⼩端模式的时候,只要将[]byte数组的下标⾸尾对换⼀下位置就可以了
func f3() {
var v3 uint32
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语言字符串转数组}
go转换demo
/
/整形转换成字节
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)
}
总结
以上所述是⼩编给⼤家介绍的go语⾔中int和byte转换⽅式,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。