使用基于endianness的Go编码/二进制将整数数组转换为字节数组

使用基于endianness的Go编码/二进制将整数数组转换为字节数组,go,Go,我已经编写了函数FromBytes,它将字节转换为整数格式,并根据endianness将其传递到IP4(),如下所示: type IP4 uint32 func FromBytes(ip []byte) IP4 { var pi IP4 buf := bytes.NewReader(ip) if <little endian> err := binary.Read(buf, binary.LittleEndian

我已经编写了函数
FromBytes
,它将字节转换为整数格式,并根据endianness将其传递到
IP4()
,如下所示:

 type IP4 uint32

 func FromBytes(ip []byte) IP4 {
       var pi IP4
       buf := bytes.NewReader(ip)
       if <little endian>
            err := binary.Read(buf, binary.LittleEndian, &pi)
       else
            err := binary.Read(buf, binary.BigEndian, &pi)
       if err != nil {
               fmt.Println("binary.Read failed:", err)
        }
       return IP4(pi)
}
类型IP4 uint32
func FromBytes(ip[]字节)IP4{
var pi IP4
buf:=字节。新读卡器(ip)
如果
err:=binary.Read(buf、binary.LittleEndian和pi)
其他的
err:=binary.Read(buf、binary.BigEndian和pi)
如果错误!=零{
fmt.Println(“binary.Read失败:”,错误)
}
返回IP4(pi)
}
我需要帮助编写一个将整数转换为字节的函数:

func (ip IP4) Octets() (a, b, c, d byte) {
    if <little endian>
        // code to convert from integer to bytes for little endian
    } else {
        // code to convert from integer to bytes for big endian
    }
    return
}
func(ip IP4)八位字节()(a、b、c、d字节){
如果
//用于将小尾数从整数转换为字节的代码
}否则{
//用于将big-endian的整数转换为字节的代码
}
返回
}

Endianness在这种情况下并不重要,只要
返回ip[0]、ip[1]、ip[2]、ip[3]
假设您需要各个字节的网络顺序。endianness只对本机整数表示有影响。FromBytes()如何?是否需要endianness检查。进行endianness检查有什么错?在
FromBytes
中,endianness检查是适当的,因为您要获取存储在字节数组中的网络顺序整数,并将其解码为本机整数类型。然而,对于
Octets
方法,再次执行此操作可能会导致在一个小的端部拱形上进行双重重新排序。您的意思是:a、b、c、d=字节(ip>>24)、字节(ip>>16)、字节(ip>>8)、字节(ip)。对于bigendian,我以相反的顺序得到八次方。对不起,我完全糊涂了。漠视一切。IP地址通常以网络(BigEndian)顺序表示,因此请始终使用
BigEndian
读取
buf
,并像在上一条注释中一样使用逻辑位移位,它对有效数字而不是字节顺序进行操作。获取错误不能使用IP(类型IP4)作为binary.LittleEndian的参数中的类型uint32。PutUint32@ravi_ss编辑答案以添加围绕IP4值的uint32()强制转换。
b := make([]byte, 4) // 4 bytes for uint32.

binary.BigEndian.PutUint32(b, uint32(yourIP4))

// and

binary.LittleEndian.PutUint32(b, uint32(yourIP4))